2016-07-15 49 views
0

由於我不知道爲什麼交易沒有回滾,我的頭靠在牆上。Jms消息驅動的渠道adaper不回滾交易

我用我的項目Spring集成和我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 ChannelsTransaction Support

+0

謝謝。這就像一個魅力。但是,AMQ會嘗試傳送8次,然後消息被消耗。如何配置將失敗的消息即使在8次嘗試後置於死隊列中? – zilcuanu

+1

這是在代理上配置的;它不是JMS規範的一部分;搜索AMQ文檔。 –