Interface ConjuntoLoteRepository
- All Superinterfaces:
io.micronaut.data.repository.CrudRepository<ConjuntoLote, String>, io.micronaut.data.repository.GenericRepository<ConjuntoLote, String>
@JdbcRepository(dialect=POSTGRES)
public interface ConjuntoLoteRepository
extends io.micronaut.data.repository.CrudRepository<ConjuntoLote, String>
Persistência de
ConjuntoLote (lote por zip). O fechamento do lote é atômico:
tentarNotificar(String, int) recebe a contagem de finalizados como parâmetro
(vinda da SPI ContadorProcessamentosFinalizados) — assim o UPDATE não
referencia a tabela de domínio do app, mas o WHERE notificado_em IS NULL preserva
a garantia de thread-vencedor único.-
Method Summary
Modifier and TypeMethodDescriptionintincrementarDuplicados(String conjuntoId) Conta um arquivo já existente (HTTP 200).intincrementarNaoProcessados(String conjuntoId) Conta uma entrada do zip que não gerou processamento nem era duplicata-sucesso.intCria o lote se ainda não existir (idempotente).inttentarNotificar(String conjuntoId, int finalizados) UPDATE atômico: retorna 1 só para o thread que completa o lote (duplicados + nao_processados +finalizados>= total), 0 para os demais.Methods inherited from interface io.micronaut.data.repository.CrudRepository
count, delete, deleteAll, deleteAll, deleteById, existsById, findAll, findById, insert, insertAll, save, saveAll, update, updateAll
-
Method Details
-
registrar
@Query(value="INSERT INTO xls_conjunto_lote (conjunto_id, total, criado_em)\nVALUES (:conjuntoId, :total, NOW())\nON CONFLICT (conjunto_id) DO NOTHING\n", readOnly=false) int registrar(String conjuntoId, int total) Cria o lote se ainda não existir (idempotente). -
incrementarDuplicados
@Query(value="UPDATE xls_conjunto_lote SET duplicados = duplicados + 1\nWHERE conjunto_id = :conjuntoId\n", readOnly=false) int incrementarDuplicados(String conjuntoId) Conta um arquivo já existente (HTTP 200). -
incrementarNaoProcessados
@Query(value="UPDATE xls_conjunto_lote SET nao_processados = nao_processados + 1\nWHERE conjunto_id = :conjuntoId\n", readOnly=false) int incrementarNaoProcessados(String conjuntoId) Conta uma entrada do zip que não gerou processamento nem era duplicata-sucesso. -
tentarNotificar
@Query(value="UPDATE xls_conjunto_lote SET notificado_em = NOW()\nWHERE conjunto_id = :conjuntoId\n AND notificado_em IS NULL\n AND (duplicados + nao_processados + :finalizados) >= total\n", readOnly=false) int tentarNotificar(String conjuntoId, int finalizados) UPDATE atômico: retorna 1 só para o thread que completa o lote (duplicados + nao_processados +finalizados>= total), 0 para os demais. A contagem de finalizados vem da SPI (não de um subquery na tabela de domínio).
-