Repository navigation
eventos
Home > Barramento de eventos 🚧
Important
Em desenvolvimento (2.0). Ainda não está numa versão lançada e pode mudar.
Vale para a 2.0 · Delphi XE em diante e Lazarus/FPC 3.2 em diante · Nível: intermediário
Em uma frase: o TRALEventBus deixa partes do programa publicarem eventos em
tópicos (pedido/criado, estoque/sp/baixo) e outras assinarem esses tópicos, sem uma
conhecer a outra; com a ponte MQTT, os mesmos eventos saem para outros programas.
Você vai precisar: o pacote RALModuleEventBusPackage (só requer PascalRAL); para
a ponte, RALModuleEventBusMQTTPackage (requer o MQTT).
uses RALEventBus;
FEventos := TRALEventBus.Create(Self);
FEventos.Subscribe('pedido/#', PedidoMudou); // pedido e tudo abaixo dele
FEventos.Subscribe('estoque/+/baixo', EstoqueBaixo); // + é um nível
FEventos.Publish('pedido/criado', '{"id":1234}');
procedure TForm1.PedidoMudou(Sender: TObject; AEvent: TRALEvent);
begin
Log(AEvent.Topic + ': ' + AEvent.Text);
end;- Os tópicos são como os do MQTT: níveis separados por
/,+vale um nível e#vale o nível em que está e tudo abaixo. - O evento leva
Payload(bytes;Textlê como texto UTF-8) e, opcionalmente, um objeto emData(não copiado nem liberado pelo barramento),Origin(quem publicou) eTimestamp. O handler lê o evento durante a chamada; não guarde o objeto. -
Publishdevolve para quantos assinantes o evento foi. - No Object Inspector,
Subscriptionslista assinaturas comFilter,OnEventeEnabled.
-
Delivery = edSync(padrão): na thread de quem publicou, um assinante depois do outro, antes dePublishvoltar. -
Delivery = edAsync: emWorkersthreads do barramento (0 = uma por processador). Cada assinante recebe os eventos na ordem em que foram publicados e uma vez só; assinantes diferentes rodam ao mesmo tempo. Na tela, useTThread.Queue. -
MaxQueuelimita a fila de cada thread: o que não cabe é descartado para aquele assinante eOnDroppedavisa. - Uma exceção num handler vai para
OnError; os outros assinantes recebem o evento normalmente.
destructor TPainel.Destroy;
begin
FEventos.UnsubscribeObject(Self); // tudo que este objeto assinou
inherited;
end;Unsubscribe(id) e UnsubscribeObject esperam terminar uma chamada do handler que
esteja rodando em outra thread, e eventos que ainda estavam na fila não chegam mais:
depois deles, o objeto pode ser liberado com segurança. WaitIdle espera as threads
entregarem tudo.
uses RALEventBus, RALEventBusAnon;
vId := FEventos.SubscribeProc('pedido/#',
procedure(AEvent: TRALEvent)
begin
Log(AEvent.Text);
end);
...
FEventos.UnsubscribeProc(vId);No Lazarus/FPC 3.2 a unit fica vazia: use métodos.
uses RALEventBusMQTT;
FPonte := TRALEventBusMQTT.Create(Self);
FPonte.Bus := FEventos;
FPonte.Client := FMQTT; // um TRALMQTTClient conectado ao broker
FPonte.OutFilters.Add('pedido/#'); // o que sai do programa
FPonte.InFilters.Add('estoque/#'); // o que entra no barramento
FMQTT.Subscriptions.Add('estoque/#', mqQoS1);- O cliente MQTT assina o que quer receber (
Subscriptions); a ponte só escolhe o que entra no barramento. - O que entrou pela ponte nunca sai de novo por ela. Se o cliente assina um tópico em que ele mesmo publica, a mensagem volta do broker: use filtros que não se cruzem, ou a opção NoLocal do MQTT 5 na assinatura.
Começar
Servidor
- Rotas e parâmetros
- Rotas avançadas: tipos, grupos, versões 🚧
- Ler o pedido e responder
- Objetos no corpo 🚧
- Resposta em fluxo 🚧
- Plugins 🚧
- Serviços (contêiner de dependências) 🚧
- Barramento de eventos 🚧
- Autenticação
- Banco de dados (DBWare)
- Servir site e arquivos
- JSON-RPC 2.0 🚧
- Servidor MCP (IA) 🚧
-
Protocol Buffers 🚧
- gRPC 🚧
- WebSocket 🚧
- Hubs (WebSocket) 🚧
- Swagger e Postman
- Servidor SOAP 🚧
- WS-Security 🚧
- HTTPS
- Criptografia ponto a ponto
- Segurança para produção
- Colocar no ar
- Desempenho
- Testes em memória 🚧
MQTT 🚧
- O que é e quando usar 🚧
- Cliente MQTT 🚧
- Broker MQTT 🚧
- MQTT-SN 🚧
- Ponte REST 🚧
- Segurança 🚧
- Rede ruim 🚧
E-mail 🚧
- Mensagens 🚧
- Enviar 🚧
- Receber 🚧
- Ler a caixa postal 🚧
- Verificar o que chega 🚧
- Servir caixas postais 🚧
- S/MIME 🚧
- OpenPGP 🚧
Chatbot 🚧
- O robô e os canais 🚧
- Telegram 🚧
- Gateways REST (WhatsApp não oficial) 🚧
- Discord 🚧
- Slack 🚧
- Microsoft Teams 🚧
- Conversa em etapas 🚧
Cliente
Motores
- Qual motor escolher?
- Compatibilidade
- Recursos
- QUIC
- Motor NgHttp2 (HTTP/2) 🚧
- Motor XSocket 🚧
- Motor AdvancedHTTP (experimental) 🚧
Avançado
Ajuda
- Problemas comuns
- Atualizar o Indy
- Várias versões do Delphi
- Vídeos e guias
- Módulos de terceiros
- Licenças
- Contribuir
- Roadmap e changelog
🚧 = em desenvolvimento, pode mudar