Skip to main content

Notifiers

Durante o ciclo de execução do processo, o FlowBuild emite uma série de eventos.

A maior parte desses eventos são automaticamente capturados e logados no console, porém para 2 tipos de eventos é possível configurar tratamentos específicos. São eles:

  • ProcessStateNotifier
  • ActivityManagerNotifier
Nota

Esses eventos podem ser utilizado para avisar interessados no processo, criar eventos para telemetria, notificações (e-mails, mensagens, etc). Tais eventos não devem, contudo, influenciar o próprio processo.

Quando implementar seu servidor do workflow, durante a inicialização, crie listeners baseados nesses 2 notifiers.

startServer
...
const flowbuild = setWorkflow(persistMode, persistArgs);
const processStateListener = buildProcessStateListener();
const activityManagerListener = buildActivityManagerListener();
flowbuild.engine.setProcessStateNofitier(processStateListener);
flowbuild.engine.setActivityManagerNofitier(activityManagerListener);
...

Process State Notifier#

Sempre que um novo estado é gerado para um processo, uma notificação é enviada contendo todos os dados de um processState.

Exemplos de aplicação:

  • capturar estados FINISHED e notificar os atores envolvidos do encerramento do processo.
  • capturar estados ERROR e enviar mensagens para os times de suporte.
  • capturar estados UNSTARTED e notificar o ator envolvido da criação do processo - caso existam casos de uso de processso iniciados em favor de terceiros.
const Logger = require('yourLogLibrary')
const { sendEvent } = require('yourTelemetryLibrary');
function buildProcessStateListener() {
return async (processState) => {
const logger = Logger.getInstance();
if(processState.status === 'error') {
logger.error(
new Error(`Error on process: ${processState.process_id}, error: ${processState.error}`),
);
}
sendEvent([{
actor_id: actorData.actor_id,
status: processState.status,
process_id: processState.process_id,
workflow_name: processState.workflow_name,
eventType: 'process_state',
}]);
};
}

Activity Manager Notifier#

Neste caso, uma notificação é emitida sempre que um activity manager é gerado, com os todos os dados, acrescido do ID do processo.

Uma implementação comum é utilizar esse notifier para notificar o usuário de uma nova atividade. O canal fica conectado a um WebSocket e o servidor posta uma mensagem neste WebSocket informando da atividade, evitando a necessidade do canal ficar executando um pooling intensivo para verificar por novas tarefas.

Exemplo
const mqtt = require('mqtt')
const connect = () => {
const settings = {
host: ...,
port: ...,
protocol: 'mqtt',
clientId: uuid()
}
const client = mqtt.connect(settings);
return client
}
const publishMessage = (client, topic, message) => {
client.publish(topic, message, { qos: 1 });
}
function buildActivityManagerListener({ client }) {
return async (activityManager) => {
const topic = `/process/${activityManager._process_id}/activity`;
const message = JSON.stringify({
activityManagerId: activityManager._id,
});
publishMessage(client, topic, message);
};
};
...
const mqttClient = connect();
startServer
...