Quando o JBoss estiver travando a melhor coisa a se fazer é fazer um dump da Stack da JVM (usando o jstack por exemplo).
Uma dica que descobri hoje é quando na stack existem várias threads bloqueadas como:
EJB default – 1 [BLOCKED] CPU time: 0:01
java.util.concurrent.Semaphore.acquire(int)
org.hornetq.core.client.impl.ClientProducerCreditsImpl.acquireCredits(int)
org.hornetq.core.client.impl.ClientProducerImpl.sendRegularMessage(MessageInternal, boolean, ClientProducerCredits)
org.hornetq.core.client.impl.ClientProducerImpl.doSend(SimpleString, Message)
org.hornetq.core.client.impl.ClientProducerImpl.send(SimpleString, Message)
org.hornetq.jms.client.HornetQMessageProducer.doSend(Message, long, HornetQDestination)
org.hornetq.jms.client.HornetQMessageProducer.send(Message)
org.hornetq.ra.HornetQRAMessageProducer.send(Message)
Um dos motivos para esse problema, pode ser o fato de uma fila (Queue) de mensagens estar cheia. Existem 3 maneiras de lidar com a fila cheia BLOCK, PAGE, DROP. Tem que ver a documentação:
http://docs.jboss.org/hornetq/2.3.0.Alpha/docs/user-manual/html/paging.html#d0e5075
<address-settings>
<address-setting match=”#”>
<dead-letter-address>jms.queue.DLQ</dead-letter-address>
<expiry-address>jms.queue.ExpiryQueue</expiry-address>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>30485760</max-size-bytes>
<address-full-policy>BLOCK</address-full-policy>
<message-counter-history-day-limit>10</message-counter-history-day-limit>
</address-setting>
</address-settings>
O BLOCK faz com que a chamada do Client Mensagem JMS fique bloqueada enquanto a fila estiver cheia.
A solução ideal é investigar porque a fila está enchendo e ninguém está consumindo, no meu caso isso era esperado (uma fila de integração que em alguns clientes não é utilizada).
Se mudar para DROP o sistema não irá travar, quando a fila encher ela vai começar a jogar os pacotes fora. Isso pode ser especificado por fila:
<address-settings>
<address-setting match=”jms.queue.QueueNaoUtilizada”>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>10485760</max-size-bytes>
<address-full-policy>DROP</address-full-policy>
</address-setting>
<address-setting match=”#”>
<redelivery-delay>0</redelivery-delay>
<max-size-bytes>10485760</max-size-bytes>
<address-full-policy>BLOCK</address-full-policy>
</address-setting>
</address-settings>
Outra dica é configurar a fila durable como false, assim o JBoss não tem o trabalho de persistir as mensagens:
<jms-queue name=”QueueNaoUtilizada”>
<entry name=”meuapp/QueueNaoUtilizada”/>
<entry name=”java:jboss/exported/meuapp/QueueNaoUtilizada”/>
<durable>false</durable>
</jms-queue>
Image may be NSFW.
Clik here to view.
Clik here to view.
