Class RelayM2m
fixed-delay carrega o lote de saída
(PENDENTE, ERRO) abaixo do teto e despacha cada mensagem pela SPI tipada. Cada transição de
estado roda em transação curta própria (via MensageriaService, cross-bean) — isolamento por
mensagem: falha (ou exceção inesperada do enviador) marca só aquela linha, o lote segue.
Sob N réplicas do MESMO app o tick é serializado por advisory lock (GuardaCluster,
chave <app>_relay_m2m). O filtro por tipo do executar() separa apps
DIFERENTES; réplicas do mesmo app registram os mesmos tipos, casam o mesmo predicado e, sem a
guarda, entregam a mesma linha ao mesmo tempo — o efeito externo (o PUT) sai em dobro.
Isso remove a duplicação evitável, não a inerente: segue AT-LEAST-ONCE (crash entre a
resposta do destino e o commit ainda reentrega) e o receptor segue obrigado a deduplicar por chave
natural (decisão 0021). Não é lock de linha, e não pode ser: o relay seleciona fora de
transação e despacha cada mensagem na transação curta dela, então um FOR UPDATE SKIP LOCKED
no select seria solto antes do envio. Reivindicar por linha exigiria estado persistido (status
em-voo + marca de reivindicação + reaper de órfão) — o estado a mais que a 0021 descartou.
-
Constructor Summary
ConstructorsConstructorDescriptionRelayM2m(MensagemM2mRepository repositorio, RoteadorEnviadores roteador, MensageriaService servico, MensageriaConfig config, br.com.xadm.comum.mensageria.GuardaCluster guarda, String appName) -
Method Summary
-
Constructor Details
-
RelayM2m
public RelayM2m(MensagemM2mRepository repositorio, RoteadorEnviadores roteador, MensageriaService servico, MensageriaConfig config, br.com.xadm.comum.mensageria.GuardaCluster guarda, @Value("${micronaut.application.name:app}") String appName)
-
-
Method Details
-
executar
public int executar()Processa um lote de saída. Público para o teste exercitar sem depender do agendador.- Returns:
- quantidade de mensagens processadas neste passe.
-