我一直在关注以前的答案,讨论插入网关/服务激活器以在SI处理中途启动新事务。我试过下面的代码,但由于某些原因它不起作用,如果你可以指出这个配置中的错误。
所有线程似乎都在等待某些事情发生,并且没有调用sp出站网关,但我无法弄清楚是什么。
这里的想法是在新事务下处理线程池中拆分器生成的每个任务。
<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);
}
答案 0 :(得分:1)
好吧,不要忘记你不仅可以使用transactional
注释标记@Transactional
。 XML声明有<tx:advice>
。
如果只需要<int-jdbc:stored-proc-outbound-gateway>
包裹到TX,则有<request-handler-advice>
个子元素将基础组件的handleRequestMessage
包装到任何Advice
:
<int-jdbc:request-handler-advice-chain>
<tx:advice>
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
</int-jdbc:request-handler-advice-chain>
从另一方面,您的代码无法正常工作,因为<int-jdbc:stored-proc-outbound-gateway>
可能无法返回结果。该程序为one-way
。但<gateway>
界面为request-reply
。
<强>更新强>
请在此处查看我的回答Keep transaction within Spring Integration flow。如何进行下游流事务处理是另一个技巧。
使用<gateway>
,您应该确保您的事务子流最终返回到replyChannel
。或者......将您的网关方法设为void
以实现单向行为。
答案 1 :(得分:1)
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" .....
您不需要default-reply-channel
;只需省略存储过程网关上的reply-channel
,回复就会自动返回。