0

WebSpherev7内のSpringv3アプリケーションで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マネージャーでミックスするというこの記事を参照しているので、大丈夫です。しかし、それはそのようには機能しません。代わりに、次のコードでは、メッセージは破壊的に読み取られ、例外がスローされたときにロールバックされません。

トランザクションロジックは(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 を構成する必要があります。

JmsTemplateトランザクションは によって処理されるため、トランザクション用に をセットアップする必要はありませんQueueConnectionFactory

余談ですが、mq だけを扱っている場合は、UOW JTA プロバイダーをスキップして、トランザクション化された JMS セッションを使用できます。これは正常に機能するはずです。

于 2013-11-19T07:45:15.923 に答える