spring - Spring MDP 中的 WebSphereUowTransactionManager 问题

标签 spring websphere websphere-7

我在使用 WebSphereUowTransactionManager 在 WebSphere 7.0 中的 Spring 3.0.4 中设置 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 消息驱动的 Bean,它按预期工作,在异常情况下它被重新传递多达 5 次。问题在于依赖注入(inject)和事务包含的语义变得更加复杂。我很确定这不是我想要的方式。

更新:
我请求 WebSphere 支持,但他们拒绝了我。正如预期的那样。

最佳答案

似乎在这个 here 上有一个 JIRA .

该人说她设法通过更换

   commitIfNecessary(session, message); // line 354


   commitIfNecessary(sessionToUse, message); 

AbstractMessageListenerContainer.java类(class)。

关于spring - Spring MDP 中的 WebSphereUowTransactionManager 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3782858/

相关文章:

java - 如何添加 Spring Security HTTP 响应 header

websphere - 如何从命令行停止/启动特定的 WebSphere 部署的 EAR?

jpa - 通过 JPA(Websphere 和 DB2)引用表时出现结果集关闭错误

java - Apache HTTPClient 和 Websphere Application Server 配置

java - 如何从代码级别识别 websphere MQ 监听器端口已关闭

mysql - org.apache.tomcat.dbcp.dbcp.SQLNestedException : Cannot create JDBC driver of class '' for connect URL 'null'

java - 如何在我的项目中正确配置 Spring Security?

java - PERSISTENT 消息的性能比 NON_PERSISTENT 消息慢得多

java - 如何通过websphere ORB调用获取数据库连接?

xml - 如何为 Spring 测试创建 TestContext?