Interface MensagemM2mRepository

All Superinterfaces:
io.micronaut.data.repository.CrudRepository<MensagemM2m, Long>, io.micronaut.data.repository.GenericRepository<MensagemM2m, Long>

@JdbcRepository(dialect=POSTGRES) public interface MensagemM2mRepository extends io.micronaut.data.repository.CrudRepository<MensagemM2m, Long>
Repositório Data JDBC da MensagemM2m. Dialeto Postgres — o dialeto de produção; o teste de plataforma sobe Postgres real (Testcontainers), então o SQL gerado é exercitado tal como roda em produção.
  • Method Details

    • findByDirecaoAndStatusInAndTipoInAndTentativasLessThanOrderById

      List<MensagemM2m> findByDirecaoAndStatusInAndTipoInAndTentativasLessThanOrderById(Direcao direcao, Collection<Status> status, Collection<String> tipo, int tentativas, io.micronaut.data.model.Pageable pageable)
      Candidatas ao despacho: saída pendente/em-erro abaixo do teto de tentativas, mais antigas primeiro, e SÓ dos tipo que ESTE app sabe rotear (os EnviadorMensagem registrados). Sem lock de linha (AT-LEAST-ONCE — dedup é do receptor).

      O filtro por tipo é o que deixa N apps dividirem a MESMA mensagem_m2m (mesmo DB/schema) sem competir: cada RelayM2m reivindica só o que consegue entregar. Sem ele, o relay do app "errado" pegava a linha de um tipo alheio, não roteava e QUEIMAVA a tentativa (dead-letter falso, quebrando o AT-LEAST-ONCE). Cada tipo tem 1 remetente → o particionamento é não-ambíguo. Chamar só com tipos não-vazio (o relay pula o tick se o app não registra nenhum enviador).

      Parameters:
      direcao - sempre Direcao.SAIDA.
      status - tipicamente [PENDENTE, ERRO].
      tipo - os tipos que este app roteia (RoteadorEnviadores.tiposRegistrados()).
      tentativas - teto exclusivo (linhas com tentativas < este valor).
      pageable - limite do lote por tick.
      Returns:
      lote a despachar.
    • listarRecentes

      @Query("SELECT * FROM mensagem_m2m ORDER BY id DESC") List<MensagemM2m> listarRecentes()
      Lista para a tela (mais recentes primeiro); filtro fino fica no controller (volume de admin).
    • deleteByStatusInAndUpdatedAtLessThan

      long deleteByStatusInAndUpdatedAtLessThan(Collection<Status> status, Instant corte)
      Poda de retenção: remove os terminais de auditoria mais velhos que o corte. PAUSADO/ CANCELADO nunca entram aqui (retidos até o operador limpar).
      Parameters:
      status - tipicamente [ENVIADO, RECEBIDO].
      corte - instante-limite; linhas com updatedAt < corte são removidas.
      Returns:
      quantidade removida.