Class RelayM2m

java.lang.Object
br.com.xadm.comum.mensageria.RelayM2m

@Singleton public class RelayM2m extends Object
Relay durável do outbox. A cada 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 Details

  • 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.