Транзакция Glassfish/JMS MDB прервана

У меня есть несколько MDB в моем приложении Glassfish 3.1.2.2, которые регулярно используют сообщения JMS. Все будет работать безупречно в течение некоторого времени после запуска приложения — от 12 часов до пары дней. Затем я начну неоднократно получать сообщение об ошибке, подобное приведенному ниже. Из текста ошибки («Транзакция клиента прервана») кажется, что контейнер пытается запустить MDB в существующей транзакции, но транзакция каким-то образом прервана, поэтому он не может вызвать MDB. Еще одна информация заключается в том, что повторное развертывание приложения не устраняет ошибку. Перезапуск Glassfish, по-видимому, приводит к исчезновению ошибки (на какое-то время, после чего она появляется снова), что заставляет меня задаться вопросом, является ли это какой-то проблемой исчерпания ресурсов.

[#|2012-09-12T21:42:15.045+0000|WARNING|glassfish3.1.2|javax.resourceadapter.mqjmsra.inbound.message|_ThreadID=74;_ThreadName=Thread-2;|MQJMSRA_MR2001: run:Caught Exception from onMessage():Redelivering:
javax.ejb.EJBException
    at com.sun.ejb.containers.MessageBeanContainer.deliverMessage(MessageBeanContainer.java:1176)
    at com.sun.ejb.containers.MessageBeanListenerImpl.deliverMessage(MessageBeanListenerImpl.java:81)
    at com.sun.enterprise.connectors.inbound.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:171)
    at $Proxy614.onMessage(Unknown Source)
    at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:260)
    at com.sun.enterprise.connectors.work.OneWork.doWork(OneWork.java:114)
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.performWork(ThreadPoolImpl.java:497)
    at com.sun.corba.ee.impl.orbutil.threadpool.ThreadPoolImpl$WorkerThread.run(ThreadPoolImpl.java:540)
Caused by: javax.ejb.TransactionRolledbackLocalException: Client's transaction aborted
    at com.sun.ejb.containers.BaseContainer.useClientTx(BaseContainer.java:4722)
    at com.sun.ejb.containers.BaseContainer.preInvokeTx(BaseContainer.java:4601)
    at com.sun.ejb.containers.MessageBeanContainer.beforeMessageDelivery(MessageBeanContainer.java:1040)
    at com.sun.ejb.containers.MessageBeanListenerImpl.beforeMessageDelivery(MessageBeanListenerImpl.java:77)
    at com.sun.enterprise.connectors.inbound.MessageEndpointInvocationHandler.invoke(MessageEndpointInvocationHandler.java:139)
    at $Proxy614.beforeDelivery(Unknown Source)
    at com.sun.messaging.jms.ra.OnMessageRunner.run(OnMessageRunner.java:247)
    ... 3 more
|#]

person Jeff    schedule 13.09.2012    source источник


Ответы (1)


Когда ошибка начинает появляться, она все еще происходит в том же потоке? Как _ThreadID=74;_ThreadName=Thread-2 в этом случае? Я сообщил об этой ошибке, когда поток оставался связанным с откатом транзакции, однако не было реакция на это. Но мы избавились от этого после того, как наше соединение с базой данных стало более стабильным.

Я бы искал последнюю активность в потоке-нарушителе, прежде чем эта ошибка начнет происходить.

person pdudits    schedule 16.09.2012