Ola galera,
estou com um problema, que gostaria muito de contar com a ajuda de voces…
Desenvolvi no trabalho uma aplicação, que após pronta e entregue descobrimos que rodaria em um servidor JBoss que utilza cluster.
Essa aplicação tem um módulo que trabalha como o framework Quartz.
Esse módulo envia emails todos os dias as 6 hrs da manha.
Com mais detalhes: o módulo está preparado para que todos os dias as 6 da manha faça uma busca no banco e encontre os emails que devem ser enviados. Ele busca os destinatários do email, a mensagem em si, o assunto, monta uma planilha excel a partir desses dados, anexa-a ao email e envia-os.
Testei tudo direitinho, funcionando perfeitamente, até que o deploy foi feito no servidor do cliente (cluster).
O problema que acontece é que está duplicando os emails. Se a consulta traz 50 emails para enviar, ele envia 100…
Dessa forma a única explicação que encontrei para o problema é que duas instâncias, do módulo que utiliza o Quartz, estão sendo criadas e disparando ao mesmo tempo.
Para dar ainda mais detalhes, após o envio de cada email o sistema faz um update nas linhas com dados que foram enviados, indicando que na próxima execução não precisará enviá-los novamente, e ao final do envio de todos os emails ele comita.
Na tentativa de me livrar desse problema, passei a utilizar na consulta um SELECT … FOR UPDATE, para dessa forma bloquear a tabela, para que a outra instância do módulo espere até que a primeira execute, para só depois obter os dados (já atualizados pelo update) e assim não duplicar o envio, porém essa abordagem não deu certo.
Gostaria de contar com a ajuda de vocês para tentar resolver esse problema.