Package br.com.xadm.comum.mensageria
MensagemM2m), um relay
@Scheduled com backoff/teto/PAUSADO (RelayM2m), uma SPI
de envio tipado (EnviadorMensagem) que cada app implementa
chamando o @Client gerado do OpenAPI, e uma tela /admin/mensageria
(MensageriaController) restrita a admin @xadm.com.br
(MensageriaAdminRule).
O motor é agnóstico de domínio; o dispatch é tipado (um bean EnviadorMensagem por
tipo, no app). Semântica AT-LEAST-ONCE: sob N instâncias do MESMO app o relay pode despachar
em dobro — o receptor deduplica por chave natural de negócio (a lib não faz dedup nem lock de linha).
N apps DIFERENTES numa mesma mensagem_m2m (mesmo DB/schema — ex.: integrador + int-pied
dividindo db_maxsul_pied): dois ownerships distintos. (1) Tabela (DDL): um app cria; os
outros consomem (migração test-only pros testes standalone) — nunca dois CREATE. (2)
Mensagem (roteamento): cada RelayM2m reivindica só os tipo que registra
(RoteadorEnviadores.tiposRegistrados()) — app sem enviador é no-op. Assim os relays não competem
(cada tipo tem 1 remetente); sem o filtro, o relay do app "errado" queimava a tentativa da linha
alheia (dead-letter falso). Par disso: MensageriaService.enfileirar(String, String, String, String) falha-rápido se o tipo
não tem enviador local (o remetente é quem enfileira). Não se resolve com config por-deploy
(RELAY_ENABLED=false), coluna de origem, nem relay-broker único.
Schema é owned pelo app (sem Flyway na lib); o DDL canônico é publicado em
db/mensagem_m2m.postgres.sql (índice (direcao, status, tipo) p/ o filtro do relay).
-
ClassDescriptionDireção da mensagem M2M.SPI de envio tipado.Retenção: poda os terminais de auditoria (
ENVIADO/RECEBIDO) mais velhos quemensageria.retencao-dias(default 30).Linha do outbox/auditoria M2M (tabelamensagem_m2m).Repositório Data JDBC daMensagemM2m.Gate da tela/admin/mensageria: exige sessão autenticada E e-mail terminando no domínio configurado (mensageria.admin.email-domain, defaultxadm.com.br).Configuração do motor (mensageria.*).Sub-configmensageria.admin.*.Sub-configmensageria.relay.*.Tela de operador/admin/mensageria(JTEmensageria.jte, decisão 0025).API do motor para os apps + transições de estado usadas pelo relay/tela.Relay durável do outbox.Resultado de uma tentativa de envio, devolvido peloEnviadorMensagem.Indexa osEnviadorMensagemdo app portipo()e resolve o despacho.Máquina de estado da mensagem M2M.