JMS no JBoss messaging

Tenho uma implementação de um EJB baseado em Mensagem no jboss 4.2
esse EJB ele recebe uma mensagem e inicia um processamento longo, porém no decorrer desse processamento, ele começa um reprocessamento desta mensagem iniciando todo o cliclo novamente.

Por que acontece isso? E o deve ser configurado para que ele não “reentrege” a mensagem.

[quote=leosouzabh]Tenho uma implementação de um EJB baseado em Mensagem no jboss 4.2
esse EJB ele recebe uma mensagem e inicia um processamento longo, porém no decorrer desse processamento, ele começa um reprocessamento desta mensagem iniciando todo o cliclo novamente.

Por que acontece isso? E o deve ser configurado para que ele não “reentrege” a mensagem.[/quote]

Sinto informá-lo mas o ideal seria vc. rever a sua implementação.

Chamadas a EJBs são transacionais e costumam ter um timeout associado. Sua lógica de processamento deve prever isto, caso contrário vc. terá que recorrer a expedientes de caráter paliativo, como aumentar o timeout ou mover sua aplicação para máquinas mais rápidas. No curto prazo pode até ser que resolva, mas é bem possível que o problema tenha apenas sido adiado, tornando-se assim uma bomba-relógio que vai explodir na sua (ou de quem quer que assuma o sistema) cara mais adiante.

No seu caso o que eu faria (e já fiz, em outras ocasiões) é o seguinte: o método que consome as mensagens da fila cria uma “ordem de serviço” e a coloca em uma tabela de controle. Em seguida utiliza o serviço de timer do EJB e agenda uma execução simples de outro método (worker).

No método worker, consulto a tabela de ordens de serviço e escolho uma de acordo com uma estratégia qualquer (pex: FIFO). Digamos que a ordem de serviço corresponda ao processamento de um milhão de registros. Obviamente teremos novamente o problema de timeout e, portanto, é necessario que vc. defina uma unidade de trabalho. Digamos que esta unidade seja o processamento de 1000 ou menos registros. O método worker deve então fazer o seguinte: executar a unidade de trabalho, atulizar a ordem de serviço e, por fim, se houver mais registros a processar, reagendar a execução do worker.

Este modelo de implementação é mais complexo sim ! Mas se seu processamento envolve grandes volumes, o uso de EJBs requer um certo cuidado.