Pular para o conteúdo principal

Event

1. Visão Geral

O componente Event (event) permite que diferentes fluxos conversem entre si por meio de eventos: um fluxo "publica" um evento com um nome, e outro fluxo (ou vários) "escuta" esse mesmo nome e reage a ele. É o padrão conhecido como publish/subscribe (publicação e assinatura).

Use quando dois ou mais fluxos precisam se comunicar sem estarem diretamente conectados (por exemplo, um fluxo dispara um evento de "pedido criado" e outro fluxo, totalmente independente, escuta esse evento para enviar uma notificação). Não use para chamadas diretas e síncronas dentro do mesmo fluxo — nesse caso, o componente Function/Function Caller é mais indicado.

2. Pré-requisitos

  • Para eventos com escopo LOCAL: nenhum requisito adicional, tudo acontece dentro da mesma instância da aplicação.
  • Para eventos com escopo SHARED (compartilhado entre instâncias/aplicações): é necessário um servidor RabbitMQ configurado e acessível pela plataforma, com usuário e senha definidos na configuração da aplicação (não no componente em si).
  • Requisitos de rede: acesso à porta padrão do RabbitMQ (5672) quando o escopo for SHARED.

3. Autenticação e Conexão

O componente não expõe campos de autenticação diretamente — a conexão com o RabbitMQ (usada apenas no escopo SHARED) é configurada em nível de aplicação, não por fluxo.

CampoObrigatórioTipoDescriçãoExemplo
eventNameSimTextoNome do evento. Deve ser o mesmo em quem publica e em quem escuta."pedido-criado"
eventScopeSimTexto: LOCAL ou SHAREDLOCAL: comunicação apenas dentro da mesma instância da aplicação. SHARED: comunicação entre diferentes instâncias/aplicações, via fila de mensagens."SHARED"
eventTypeNãoTexto: SYNC ou ASYNCDefine se quem publica o evento espera uma resposta (SYNC) ou apenas dispara e segue em frente (ASYNC). Valor padrão: vazio (nenhum tipo definido)."SYNC"
timeoutNãoNúmero (milissegundos)Tempo máximo de espera por uma resposta em eventos síncronos, ou tempo de vida da mensagem na fila. Valor padrão: 3600000 (1 hora).30000
executeOnExpireNãoTextoNome de uma função (registrada com o componente Function) a ser chamada se a mensagem expirar antes de ser processada."tratarEventoExpirado"

4. Configuração / Operações Suportadas

O componente atua de duas formas dentro de um fluxo:

  • Como gatilho (escuta): o fluxo inicia quando o evento configurado é publicado em algum lugar.
  • Como ação (publicação): em outro ponto do fluxo, o componente publica um evento com o nome configurado, enviando o corpo atual da mensagem.

Ao publicar um evento síncrono (eventType: SYNC), quem publicou espera a resposta de quem escutou, dentro do tempo definido em timeout. Ao publicar um evento assíncrono (eventType: ASYNC), a publicação não espera resposta.

Comportamento em caso de erro: se a mensagem expirar (passou do tempo definido em timeout antes de ser processada), o evento não é executado e, se executeOnExpire estiver configurado, essa função é chamada para tratar a expiração. Se a execução do evento falhar, o erro é propagado para quem publicou (em eventos síncronos).

5. Exemplos Práticos

Exemplo simples: dois fluxos dentro da mesma aplicação. O primeiro publica um evento chamado "cliente-atualizado" com eventScope: LOCAL sempre que um cadastro é alterado. O segundo fluxo escuta esse mesmo evento e atualiza um cache interno sempre que ele acontece.

Entrada do fluxo que publica:

{
"clienteId": 456,
"camposAlterados": ["email", "telefone"]
}

Configuração do componente que publica o evento:

{
"componentName": "event",
"configurations": {
"eventName": "cliente-atualizado",
"eventScope": "LOCAL",
"eventType": "ASYNC"
}
}

Configuração do componente que escuta o evento (início do fluxo que reage):

{
"componentName": "event",
"configurations": {
"eventName": "cliente-atualizado",
"eventScope": "LOCAL"
}
}

O fluxo que escuta recebe exatamente o mesmo corpo publicado:

{
"clienteId": 456,
"camposAlterados": ["email", "telefone"]
}

Exemplo avançado: dois sistemas diferentes (rodando em instâncias separadas) precisam trocar informação de forma síncrona. O fluxo A publica um evento "validar-estoque" com eventScope: SHARED e eventType: SYNC, esperando até 30 segundos (timeout: 30000) pela resposta do fluxo B, que está escutando esse mesmo evento em outra aplicação. Se o fluxo B demorar mais que isso, a mensagem expira e a função configurada em executeOnExpire é chamada para registrar a falha.

Entrada do fluxo que publica:

{
"produtoId": "SKU-789",
"quantidade": 5
}

Configuração do componente que publica:

{
"componentName": "event",
"configurations": {
"eventName": "validar-estoque",
"eventScope": "SHARED",
"eventType": "SYNC",
"timeout": "30000",
"executeOnExpire": "tratarEventoExpirado"
}
}

Resposta recebida por quem publicou, quando o fluxo B responde a tempo:

{
"responses": [
{ "body": "{\"disponivel\":true,\"quantidadeEstoque\":42}" }
]
}

6. Pontos de atenção

  • No escopo LOCAL, o evento só é visto por fluxos rodando na mesma instância da aplicação.
  • No escopo SHARED, depende de um RabbitMQ acessível para publicar e escutar eventos.
  • Eventos síncronos ficam aguardando resposta até o timeout configurado — vale dimensionar esse valor de acordo com o tempo real de processamento esperado.

7. Erros Comuns e Troubleshooting

Erro / SintomaCausa provávelComo resolver
Evento publicado nunca é recebidoeventName não é idêntico entre quem publica e quem escuta, ou os escopos (LOCAL/SHARED) são diferentes.Conferir se o nome do evento e o escopo são exatamente os mesmos nos dois lados.
Publicação síncrona demora e retorna erroNinguém está escutando o evento, ou quem escuta demora mais que o timeout configurado.Confirmar se existe um fluxo ativo escutando esse evento e aumentar o timeout se necessário.
"Timeout at [horário]. Skipping execution" (no log)A mensagem chegou depois do tempo limite definido em timeout.Revisar se o timeout está adequado ao tempo real de processamento esperado, ou investigar lentidão no consumidor.
Evento no escopo SHARED não funcionaRabbitMQ não está acessível ou mal configurado na aplicação.Verificar a conectividade e as credenciais do RabbitMQ configuradas na aplicação.