Spring集成:2个激活器之间的事务处理困难

Mas*_*ues 7 spring transactions spring-integration

我有这个用例.

第一链:

<int:chain input-channel="inserimentoCanaleActivate" output-channel="inserimentoCanalePreRouting">      
    <int:service-activator ref="inserimentoCanaleActivator" method="activate" />                
</int:chain>
Run Code Online (Sandbox Code Playgroud)

这是相关代码:

@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<InserimentoCanale> eventMessage) {
    ...
    // some Database changes
    dao.save(myObject);
}
Run Code Online (Sandbox Code Playgroud)

一切都很好.

然后我有另一个链:

<int:chain id="onlineCensimentoClienteChain" input-channel="ONLINE_CENSIMENTO_CLIENTE" output-channel="inserimentoCanaleActivate">
    <int:service-activator ref="onlineCensimentoClienteActivator" method="activate" />
    <int:splitter expression="payload.getPayload().getCanali()" />
</int:chain>
Run Code Online (Sandbox Code Playgroud)

而相对激活者:

@Override
public EventMessage<CensimentoCliente> activate(EventMessage<CensimentoCliente> eventMessage) {
    ...
    // some Database changes
    dao.save(myObject);
}
Run Code Online (Sandbox Code Playgroud)

CensimentoCliente如下所述的有效载荷具有List第一链的有效载荷的,所以用一个分离器我分裂名单上并重新使用第一链的代码.

public interface CensimentoCliente extends Serializable {

    Collection<? extends InserimentoCanale> getCanali();

    void setCanali(Collection<? extends InserimentoCanale> canali);
    ...
}
Run Code Online (Sandbox Code Playgroud)

但是,由于每个激活器都获得了他的事务定义(因为第一个激活器可以在没有第二个激活器的情况下生存),我有一个用例,其中事务是分开的.

目标是让两个链的数据库修改成为同一事务的一部分.

有帮助吗?

亲切的问候马西莫

JVX*_*VXR 0

这些是修改2个独立的关系数据库吗?如果是这样,您正在查看 XA 事务。现在,如果您在像 tomcat 这样的非 XA 容器上运行它,则所有这些都必须在事务管理器监视的单个线程中完成 - (您必须依赖实际触发这些事件的事务管理器)。事务管理器可以是 JMS 消息或针对某些数据源的轮询器。此外,此处理必须在单个线程中完成,以便 spring 可以帮助您在单个事务中运行整个过程。

最后一点,不要在服务激活器之间引入线程池/队列。这可能会导致激活器在单独的线程中运行