使用消息驱动的通道适配器时的事务处理&服务激活者

时间:2012-05-04 15:23:48

标签: jms distributed-transactions spring-integration

我正在开发一个POC,它执行以下操作

  1. 使用消息驱动的通道适配器接收事务中的消息
  2. 调用Service Activator,它使用处理程序将从适配器收到的消息插入到DB中,并将消息发布到出站通道。
  3. 现在,如果消息的数据库插入失败,我希望将JMS消息返回到队列,以便以后可以重新尝试。

    使用我的以下配置它似乎不起作用。(即使插入数据库时​​出现故障,消息也会从队列中删除。

    任何指针或示例配置都会有所帮助。

    <integration:channel id="jmsInChannel">         
        <integration:queue/>
    </integration:channel>
    
    <int-jms:message-driven-channel-adapter id="jmsIn"
        transaction-manager="transactionManager"
        connection-factory="sConnectionFactory"
        destination-name="emsQueue"
        acknowledge="client" channel="jmsInChannel"
        extract-payload="false"/>   
    
    <integration:service-activator input-channel="jmsInChannel"
        output-channel="fileNamesChannel" ref="handler" method="process" />
    
    <bean id="handler" class="com.irebalpoc.integration.MessageProcessor">
        <property name="jobHashTable" ref="jobsMapping" />
    </bean>
    

1 个答案:

答案 0 :(得分:5)

设置acknowledge =“transacted”,我假设transactionManager是一个JDBC(或JTA)事务管理器。

您还需要删除&lt; queue /&gt;来自JmsInChannel,以便数据库事务发生在同一个线程上。

Spring将使数据库事务与JMS事务同步。

但是,请阅读http://www.javaworld.com/javaworld/jw-01-2009/jw-01-spring-transactions.html了解其含义。

如果您无法使服务具有幂等性,则可能需要查看XA事务管理器。