Java Spring集成、JMS入站通道适配器和事务
我正在使用配置了jms:message-driven通道适配器的SI。我的用例是接收来自队列的消息,通过JDBC将其保存到数据库,提交来自队列的消息,然后根据其类型让该消息继续通过各种通道。如果消息随后出错,这是正常的,因为我有原始存储在数据库中,所以可以重放 我的问题是在数据库持久化后立即尝试从队列提交事务。这实际上是中间流程,我只能让spring事务管理在最后尝试并提交。这是不合适的,因为如果在数据库持久化之后抛出错误,它仍然会将消息留在JMS队列上,因为外部事务就是在这里发起的 那么,有没有一种简单的方法可以从JMS队列中提取消息,保存到数据库,然后将其从队列中提交,并为剩余的流启动一个新事务 谢谢Java Spring集成、JMS入站通道适配器和事务,java,spring,jms,integration,transactionscope,Java,Spring,Jms,Integration,Transactionscope,我正在使用配置了jms:message-driven通道适配器的SI。我的用例是接收来自队列的消息,通过JDBC将其保存到数据库,提交来自队列的消息,然后根据其类型让该消息继续通过各种通道。如果消息随后出错,这是正常的,因为我有原始存储在数据库中,所以可以重放 我的问题是在数据库持久化后立即尝试从队列提交事务。这实际上是中间流程,我只能让spring事务管理在最后尝试并提交。这是不合适的,因为如果在数据库持久化之后抛出错误,它仍然会将消息留在JMS队列上,因为外部事务就是在这里发起的 那么,有没
Rich您可以保存到数据库,然后将消息放入可轮询的频道:
<channel id="aChannel">
<queue capacity="10"/>
</channel>
这将使任何后续流都位于新事务中,因为新流将由不同的线程处理-基于与此可轮询通道关联的轮询器。谢谢,这听起来是一个不错的方法。是否可以发送到直接通道并启动新事务?基本上,我不希望JMS输入通道溢出轮询器通道。如果使用直接通道,则直接通道连接的所有操作都将在同一执行线程中执行,在您的情况下,从从从队列中提取消息开始,到将消息保存到数据库并保存到后续流,而是等待流完成后再从队列中提取另一条消息。打破这种局面的一个好办法是在两者之间引入一个缓冲通道,如答案中所示,这样就引入了一个新的线程和一个新的事务边界。不过,您可能可以使用直接通道以编程的方式完成此操作—仅在DB persist点使用显式jms事务—但这可能会变得非常复杂。