Resolvi esses dias um problema interessante. Num determinado projeto, existem serviços de integração rodando num JBoss e alguns deles são baseados no processamento de arquivos anexados em emails. No entanto, as vezes essas threads simplesmente paravam de emitir log e, como o número de transações do sistema é alto e o log é rotacionado após um certo tamanho, não era possível determinar a causa.
Antes mesmo que eu reconfigurasse o log para poder diagnosticar o que estava acontecendo, percebi que a thread congelava após tentar efetuar login no servidor SMTP. Verifiquei a API em busca de uma maneira padrão de realizar as operações com timeout, mas não encontrei. Contudo, a implementação da Sun possui duas propriedades que permitem controlar o timeout do acesso a uma caixa de mensagens POP3: mail.pop3.connectiontimeout
e mail.pop3.timeout
, conforme documentado aqui.
A parte “assustadora” dessa correção foi descobrir que o padrão dessas propriedades é nunca causar timeout. Logo, as threads iam ficar congeladas até o próximo deploy/restart/reboot. Mais uma lição aprendida.