2

我正在研究执行以下操作的 POC

  1. 使用消息驱动的通道适配器在事务中接收消息
  2. 调用服务激活器,该服务激活器使用处理程序将从适配器收到的消息插入到数据库,并将消息发布到出站通道。

现在,如果消息的 DB 插入失败,我希望 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>
4

1 回答 1

5

设置acknowledge="transacted",我认为transactionManager 是一个JDBC(或JTA)事务管理器。

您还需要从 JmsInChannel 中删除 <queue/> ,以便数据库事务发生在同一个线程上。

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

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

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

于 2012-05-04T15:53:24.277 回答