我正在尝试在WebSphere v7中的Spring v3应用程序中使用XA事务。
我的应用上下文显示:
<bean id="jmsConnectionFactory"
class="org.springframework.jndi.JndiObjectFactoryBean">
<property name="jndiName" value="jms/MQConnectionFactory"/>
<property name="resourceRef" value="true"/>
</bean>
<bean id="jmsTemplate" class="org.springframework.jms.core.JmsTemplate">
<property name="connectionFactory" ref="jmsConnectionFactory"/>
</bean>
<jee:jndi-lookup id="myDB" jndi-name="jdbc/myDB"/>
<bean id="txManager"
class="org.springframework.transaction.jta.WebSphereUowTransactionManager" />
<tx:annotation-driven transaction-manager="txManager"/>
我在UOW txn管理器中引用this article表示混合,你会没事的。但它不会那样工作。相反,在以下代码中,消息被破坏性地读取,并且在抛出异常时不回滚。
事务逻辑是(在scala中):
@Transactional(rollbackFor = Array(classOf[Throwable]))
def processNextMessage(category: String) = {
val maybeMessage = readNextMessage(category) // <- this is a destructive read
for (message <- maybeMessage) {
// this is temporary code for testing
throw new RuntimeException("blaaaaaah")
// end temporary code
// sendToQueue(message, queue)
// writeToMessageStore(message)
}
}
有人可以建议我如何在Spring中使用WebSphere的JTA事务管理器吗?
答案 0 :(得分:0)
首先,我真的希望看到readNextMessage
的代码,因为这可能是罪魁祸首。
队列连接工厂是否设置为XA资源。您正在尝试将JTA用于事务,因此据我所知您需要相应地配置消息qcf。
您无需为事务设置JmsTemplate
,因为这些事务由QueueConnectionFactory
处理。
旁注:如果您只是处理mq,可以跳过UOW JTA提供程序并使用事务处理的JMS会话,这应该可以正常工作。