Spring integration 使用网关启动事务
我一直在遵循前面的回答,其中谈到在SI处理过程中插入网关/服务激活器来启动新事务。我已经尝试了下面的代码,但由于某些原因它无法工作,如果您可以指出此配置中的错误,请 所有线程似乎都在等待发生什么事情,sp出站网关没有被调用,但我不知道是什么 这里的想法是在一个新事务下,在线程池中处理splitter生成的每个任务Spring integration 使用网关启动事务,spring-integration,Spring Integration,我一直在遵循前面的回答,其中谈到在SI处理过程中插入网关/服务激活器来启动新事务。我已经尝试了下面的代码,但由于某些原因它无法工作,如果您可以指出此配置中的错误,请 所有线程似乎都在等待发生什么事情,sp出站网关没有被调用,但我不知道是什么 这里的想法是在一个新事务下,在线程池中处理splitter生成的每个任务 <int:splitter...output-channel="taskChannel"/> <int:channel id="taskChannel">
<int:splitter...output-channel="taskChannel"/>
<int:channel id="taskChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<int:gateway id="txGw" service-interface="com.some.test.StartTransactionalGateway"
default-request-channel="taskChannel" default-reply-channel="individualTask">
</int:gateway>
<int:service-activator ref="txGw"
input-channel="taskChannel"
output-channel="individualTask"
method="startTx"
auto-startup="true">
</int:service-activator>
<int-jdbc:stored-proc-outbound-gateway ...request-channel="individualTask" .....
interface StartTransactionalGateway {
@Transactional
Message<?> startTx(Message<?> m);
}
好吧,别忘了,你可以标记一些事务性的,而不仅仅是使用@transactional
注释。XML声明中有
如果只需要将该
包装到TX,则有
子元素将基础组件的HandlerRequestMessage
包装到任何通知中:
<int-jdbc:request-handler-advice-chain>
<tx:advice>
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</int-jdbc:request-handler-advice-chain>
从另一方面看,您的代码无法工作,因为
可能不会返回结果。该过程是单向的。但是
界面是请求-回复
更新
请看我的答案。这是如何使下游流具有事务性的另一个技巧
使用
时,您应该确保事务子流最终返回到replyChannel
。或将网关的方法设置为void,以实现单向行为。default request channel=“taskChannel”
网关正在向自身发送消息
不能将子流中的通道与主通道混合。你需要像
<int:splitter...output-channel="taskChannel"/>
<int:channel id="taskChannel">
<int:dispatcher task-executor="taskExecutor"/>
</int:channel>
<int:service-activator ref="txGw"
input-channel="taskChannel"
output-channel="whereWeWantTheResultsToGo"
method="startTx"
reply-timeout="0"
auto-startup="true" />
<int:gateway id="txGw" service-interface="com.some.test.StartTransactionalGateway"
default-request-channel="toStoredProc" />
<int-jdbc:stored-proc-outbound-gateway ...request-channel="toStoredProd" .....
好的观点;如果您想在同一事务中调用多个端点,那么您实际上只需要在流中使用一个tx网关。非常感谢您了解这一点。但我确实有后续处理,SP调用只是获取更多任务数据的第一步,而不是开始处理并最终发送JMS消息。在此之后,我又进行了一次db调用,最后提交事务,以表示一切正常,否则将回滚。感谢Artem,根据您的回答,我正在尝试在taskExecutor线程上启动一个新事务,但由于某些原因,它无法启动事务,有任何原因说明它无法工作吗?这是正确的,因为Executor.execute
会启动一个新的线程(大致如此),当然,execute
线程上的TX从单独的线程中看不到。谢谢,Gary,它确实按照您的建议工作,但是当SP调用返回时,事务会作为子线程提交,我现在需要以某种方式将其余的处理放在它下面。提交发生在线程返回到网关时,因此在tx范围内需要的一切都必须发生在网关的下游。链接组件-存储的过程回复通道
连接到下一个组件,等等。省略最后一个组件上的回复通道
或输出通道
,然后发送将提交。或者,简单地将所有内容放在一个
中,没有输出频道。谢谢Gary,我尝试了前一个选项,它可以工作。因为在这个处理结束时我没有任何返回(它在出站适配器上结束),所以我将网关接口更改为void,它似乎按照我的需要工作。我也将尝试后面的选项。您还可以在网关上设置回复超时=“0”
;这样,您就可以对返回应答的子流使用相同的网关。直到线程返回到网关,回复计时器才会启动,因此没有回复时它是不可操作的。感谢分享这些详细信息!!