2016-07-15 19 views
0

トランザクションがなぜロールバックされないのかわからないので、私は壁に向かって頭を壊しています。トランザクションをロールバックしないJmsメッセージドリブンチャネルのadaper

私は私のプロジェクトで春の統合を使用していますし、私のapplicationContext.xmlは、以下のようになります。

<context:component-scan base-package="com.jms.spring.integration.*"></context:component-scan> 

<tx:annotation-driven/> 

<int:poller default="true" id="poller" fixed-delay="500"></int:poller> 

<int-jms:message-driven-channel-adapter 
    channel="processEmpChannel" destination-name="com.test.inputqueue" acknowledge="transacted" connection-factory="targetConnectionFactory"/> 

<bean id="targetConnectionFactory" class="org.apache.activemq.ActiveMQConnectionFactory"> 
    <property name="brokerURL" value="tcp://localhost:61616"></property> 
</bean> 
<bean id="springExample" class="com.jms.spring.integration.SpringIntegrationJmsExample"> 
</bean> 

<int:service-activator input-channel="processEmpChannel" 
    ref="springExample" method="handleClient"> 
    <int:poller ref="poller"></int:poller> 
</int:service-activator> 

私のjavaファイルは次のようになります。私は、キューにメッセージを投稿すると

package com.jms.spring.integration; 

import org.springframework.context.ApplicationContext; 
import org.springframework.context.support.ClassPathXmlApplicationContext; 
import org.springframework.jms.core.JmsTemplate; 
import org.springframework.transaction.annotation.Transactional; 

public class SpringIntegrationJmsExample { 
    @Transactional 
    public void handleClient(String str){ 
     System.out.println("handleClient"); 
     throw new RuntimeException("Throwing some runtime exception...."); 
    } 

    public static void main(String[] args) { 
     ApplicationContext context = new ClassPathXmlApplicationContext("applicationContext.xml"); 
    } 
} 

、私は例外は参照してくださいが、キュー内のメッセージは消費されます。トランザクションはロールバックされず、メッセージはキューに戻されません。私が間違っているところを教えてください。

答えて

1

processEmpChannelはQueueChannelであるため、メッセージはチャネルキューに入れられるとすぐに(サービスによって処理される前に)コミットされます。

サービスアクティベータがリスナーコンテナスレッド(ポーラーの削除)で実行されるようにトランザクションが正常に動作するようにするには、DirectChannelを使用する必要があります。

Message ChannelsおよびTransaction Supportを参照してください。

+0

ありがとうございました。それは魅力のように働いた。ただし、AMQは8回配信を試み、メッセージが消費されます。デッドキューで8回試行しても失敗したメッセージを設定するにはどうすればよいですか? – zilcuanu

+1

これはブローカで設定されています。 JMS仕様の一部ではありません。 AMQドキュメントを検索します。 –

関連する問題