Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Spring集成、JMS入站通道适配器和事务_Java_Spring_Jms_Integration_Transactionscope - Fatal编程技术网

Java Spring集成、JMS入站通道适配器和事务

Java Spring集成、JMS入站通道适配器和事务,java,spring,jms,integration,transactionscope,Java,Spring,Jms,Integration,Transactionscope,我正在使用配置了jms:message-driven通道适配器的SI。我的用例是接收来自队列的消息,通过JDBC将其保存到数据库,提交来自队列的消息,然后根据其类型让该消息继续通过各种通道。如果消息随后出错,这是正常的,因为我有原始存储在数据库中,所以可以重放 我的问题是在数据库持久化后立即尝试从队列提交事务。这实际上是中间流程,我只能让spring事务管理在最后尝试并提交。这是不合适的,因为如果在数据库持久化之后抛出错误,它仍然会将消息留在JMS队列上,因为外部事务就是在这里发起的 那么,有没

我正在使用配置了jms:message-driven通道适配器的SI。我的用例是接收来自队列的消息,通过JDBC将其保存到数据库,提交来自队列的消息,然后根据其类型让该消息继续通过各种通道。如果消息随后出错,这是正常的,因为我有原始存储在数据库中,所以可以重放

我的问题是在数据库持久化后立即尝试从队列提交事务。这实际上是中间流程,我只能让spring事务管理在最后尝试并提交。这是不合适的,因为如果在数据库持久化之后抛出错误,它仍然会将消息留在JMS队列上,因为外部事务就是在这里发起的

那么,有没有一种简单的方法可以从JMS队列中提取消息,保存到数据库,然后将其从队列中提交,并为剩余的流启动一个新事务

谢谢


Rich

您可以保存到数据库,然后将消息放入可轮询的频道:

<channel id="aChannel">
    <queue capacity="10"/>
</channel>

这将使任何后续流都位于新事务中,因为新流将由不同的线程处理-基于与此可轮询通道关联的轮询器。

谢谢,这听起来是一个不错的方法。是否可以发送到直接通道并启动新事务?基本上,我不希望JMS输入通道溢出轮询器通道。如果使用直接通道,则直接通道连接的所有操作都将在同一执行线程中执行,在您的情况下,从从从队列中提取消息开始,到将消息保存到数据库并保存到后续流,而是等待流完成后再从队列中提取另一条消息。打破这种局面的一个好办法是在两者之间引入一个缓冲通道,如答案中所示,这样就引入了一个新的线程和一个新的事务边界。不过,您可能可以使用直接通道以编程的方式完成此操作—仅在DB persist点使用显式jms事务—但这可能会变得非常复杂。