首页 文章

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

提问于
浏览
2

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

  • 使用消息驱动的通道适配器来接收事务中的消息

  • 调用Service Activator,它使用处理程序将从适配器收到的消息插入到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>

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事务管理器 .

相关问题