0

我试图让 XA 事务在 WebSphere v7 内的 Spring v3 应用程序中工作。

我的应用上下文内容如下:

<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 管理器中混合,你会没事的。但它不是那样工作的。相反,在下面的代码中,消息被破坏性地读取,并且在引发异常时不会回滚。

事务逻辑是(在 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)
  }
}

谁能建议我如何将 WebSphere 的 JTA 事务管理器与 Spring 一起使用?

4

1 回答 1

0

首先,我真的很想看看代码,readNextMessage因为这可能是罪魁祸首。

队列连接工厂是否设置为 XA 资源。您正在尝试将 JTA 用于事务,据我所知,您需要相应地配置消息 qcf。

您不必设置JmsTemplatefor 事务,因为这些事务由QueueConnectionFactory.

附带说明:如果您只是在处理 mq,则可以跳过 UOW JTA 提供程序并使用事务处理的 JMS 会话,这应该可以正常工作。

于 2013-11-19T07:45:15.923 回答