使用网关启动事务

时间:2014-11-12 14:50:12

标签: spring-integration

我一直在关注以前的答案,讨论插入网关/服务激活器以在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);

}

2 个答案:

答案 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,回复就会自动返回。