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.
| Campo | Obrigatório | Tipo | Descrição | Exemplo |
|---|---|---|---|---|
eventName | Sim | Texto | Nome do evento. Deve ser o mesmo em quem publica e em quem escuta. | "pedido-criado" |
eventScope | Sim | Texto: LOCAL ou SHARED | LOCAL: 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" |
eventType | Não | Texto: SYNC ou ASYNC | Define 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" |
timeout | Não | Nú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 |
executeOnExpire | Não | Texto | Nome 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
timeoutconfigurado — vale dimensionar esse valor de acordo com o tempo real de processamento esperado.
7. Erros Comuns e Troubleshooting
| Erro / Sintoma | Causa provável | Como resolver |
|---|---|---|
| Evento publicado nunca é recebido | eventName 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 erro | Ningué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 funciona | RabbitMQ não está acessível ou mal configurado na aplicação. | Verificar a conectividade e as credenciais do RabbitMQ configuradas na aplicação. |