Spring integration 使用网关启动事务

Spring integration 使用网关启动事务,spring-integration,Spring Integration,我一直在遵循前面的回答,其中谈到在SI处理过程中插入网关/服务激活器来启动新事务。我已经尝试了下面的代码,但由于某些原因它无法工作,如果您可以指出此配置中的错误,请 所有线程似乎都在等待发生什么事情,sp出站网关没有被调用,但我不知道是什么 这里的想法是在一个新事务下,在线程池中处理splitter生成的每个任务 <int:splitter...output-channel="taskChannel"/> <int:channel id="taskChannel">

我一直在遵循前面的回答,其中谈到在SI处理过程中插入网关/服务激活器来启动新事务。我已经尝试了下面的代码,但由于某些原因它无法工作,如果您可以指出此配置中的错误,请

所有线程似乎都在等待发生什么事情,sp出站网关没有被调用,但我不知道是什么

这里的想法是在一个新事务下,在线程池中处理splitter生成的每个任务

<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”
;这样,您就可以对返回应答的子流使用相同的网关。直到线程返回到网关,回复计时器才会启动,因此没有回复时它是不可操作的。感谢分享这些详细信息!!