2010-09-23 1 views
4

У меня возникли проблемы с настройкой MDP весной 3.0.4 в WebSphere 7.0 с помощью WebSphereUowTransactionManager.Проблемы с WebSphereUowTransactionManager весной MDP

Если я не использую WebSphereUowTransactionManager, он работает нормально. Без этого у меня не будет никаких XA-действий для ошибок, поэтому я думаю, что мне это действительно нужно.

Вот что происходит на сервере:

[9/22/10 16:26:35:093 CDT] 00000070 SystemOut  O 16:26:35.093 [WorkManager.DefaultWorkManager : 4] DEBUG o.s.t.j.WebSphereUowTransactionManager - Creating new transaction with name [jmsContainer]: PROPAGATION_REQUIRED,ISOLATION_DEFAULT 
[9/22/10 16:26:36:140 CDT] 00000070 SystemOut  O 16:26:36.140 [WorkManager.DefaultWorkManager : 4] DEBUG o.s.j.l.DefaultMessageListenerContainer - Initiating transaction rollback on listener exception 
java.lang.NullPointerException: null 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:571) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:354) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1056) [org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:952) [org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.scheduling.commonj.DelegatingWork.run(DelegatingWork.java:61) [org.springframework.context.support-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1150) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.asynchbeans.WorkWithExecutionContextImpl.go(WorkWithExecutionContextImpl.java:199) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.asynchbeans.CJWorkItemImpl.run(CJWorkItemImpl.java:188) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550) [com.ibm.ws.runtime.jar:na] 
[9/22/10 16:26:36:140 CDT] 00000070 SystemOut  O 16:26:36.140 [WorkManager.DefaultWorkManager : 4] DEBUG o.s.t.j.WebSphereUowTransactionManager - Initiating transaction rollback 
[9/22/10 16:26:41:140 CDT] 00000070 SystemOut  O 16:26:41.140 [WorkManager.DefaultWorkManager : 4] WARN o.s.j.l.DefaultMessageListenerContainer - Setup of JMS message listener invoker failed for destination 'queue://testQ?busName=WorkManagementBus' - trying to recover. Cause: null 
java.lang.NullPointerException: null 
    at org.springframework.jms.listener.AbstractMessageListenerContainer.commitIfNecessary(AbstractMessageListenerContainer.java:571) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.doReceiveAndExecute(AbstractPollingMessageListenerContainer.java:354) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.AbstractPollingMessageListenerContainer.receiveAndExecute(AbstractPollingMessageListenerContainer.java:241) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.invokeListener(DefaultMessageListenerContainer.java:1056) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.jms.listener.DefaultMessageListenerContainer$AsyncMessageListenerInvoker.run(DefaultMessageListenerContainer.java:952) ~[org.springframework.jms-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at org.springframework.scheduling.commonj.DelegatingWork.run(DelegatingWork.java:61) [org.springframework.context.support-3.0.4.RELEASE.jar:3.0.4.RELEASE] 
    at com.ibm.ws.asynchbeans.J2EEContext.run(J2EEContext.java:1150) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.asynchbeans.WorkWithExecutionContextImpl.go(WorkWithExecutionContextImpl.java:199) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.asynchbeans.CJWorkItemImpl.run(CJWorkItemImpl.java:188) [com.ibm.ws.runtime.jar:na] 
    at com.ibm.ws.util.ThreadPool$Worker.run(ThreadPool.java:1550) [com.ibm.ws.runtime.jar:na] 
[9/22/10 16:26:41:140 CDT] 00000070 SystemOut  O 16:26:41.140 [WorkManager.DefaultWorkManager : 4] INFO o.s.j.l.DefaultMessageListenerContainer - Successfully refreshed JMS Connection 

Вот мой applicationContext.xml файл:

<bean id="transactionManager" class="org.springframework.transaction.jta.WebSphereUowTransactionManager" /> 
<bean id="myTaskExecutor" class="org.springframework.scheduling.commonj.WorkManagerTaskExecutor"> 
    <property name="workManagerName" value="wm/default" /> 
</bean> 

<jee:jndi-lookup id="queue" jndi-name="jms/queue" resource-ref="true" proxy-interface="javax.jms.Queue"></jee:jndi-lookup> 
<jee:jndi-lookup id="connectionFactory" jndi-name="jms/ConnectionFactory" resource-ref="true"></jee:jndi-lookup> 

<bean id="jmsContainer" 
    class="org.springframework.jms.listener.DefaultMessageListenerContainer"> 
    <property name="connectionFactory" ref="connectionFactory"></property> 
    <property name="destination" ref="queue"></property> 
    <property name="messageListener" ref="testMessageListener"></property> 

    <property name="taskExecutor" ref="myTaskExecutor"></property> 
    <property name="transactionManager" ref="transactionManager"></property> 
</bean> 

<bean id="testMessageListener" class="navy.jmsey.TestMessageListener" /> 

Я не могу понять, почему это не работает. Я думаю, что я делаю все, что должен. Я следовал указаниям в http://www.ibm.com/developerworks/websphere/techjournal/0609_alcott/0609_alcott.html.

Кто-нибудь видел это или видел, что я делаю неправильно?

Спасибо.

Обновление: Я пробовал делать EJB3 Message-driven Bean и работает так, как ожидалось, при исключении он получает redelivered до 5 раз. Проблема в том, что семантика для инъекций зависимостей и сдерживания транзакций только усложнилась. Я почти уверен, что это не то, как я хочу идти.

Обновление: Я попросил поддержку WebSphere, но они отвратили меня. Как и ожидалось.

ответ

1

Кажется, есть JIRA на этом here.

Человек говорит, ей удалось получить работу, заменив

commitIfNecessary(session, message); // line 354 

с

commitIfNecessary(sessionToUse, message); 

в AbstractMessageListenerContainer.java классе.

+0

Это имеет смысл. Я слишком много внимания уделял менеджеру транзакций, но на самом деле это не вызвало. Ошибка в не кэшированных сеансах действительно является виновником. Я проверю все это завтра, вернувшись к 3.0.2, который до этого появился. В ожидании этого я дам вам ваш +100. –

+0

Поведение, подтвержденное в 3.0.2. Теперь будет ждать 3.0.5. Еще раз спасибо. –

Смежные вопросы