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)
但是,由于每个激活器都获得了他的事务定义(因为第一个激活器可以在没有第二个激活器的情况下生存),我有一个用例,其中事务是分开的.
目标是让两个链的数据库修改成为同一事务的一部分.
有帮助吗?
亲切的问候马西莫
这些是修改2个独立的关系数据库吗?如果是这样,您正在查看 XA 事务。现在,如果您在像 tomcat 这样的非 XA 容器上运行它,则所有这些都必须在事务管理器监视的单个线程中完成 - (您必须依赖实际触发这些事件的事务管理器)。事务管理器可以是 JMS 消息或针对某些数据源的轮询器。此外,此处理必须在单个线程中完成,以便 spring 可以帮助您在单个事务中运行整个过程。
最后一点,不要在服务激活器之间引入线程池/队列。这可能会导致激活器在单独的线程中运行
| 归档时间: |
|
| 查看次数: |
2552 次 |
| 最近记录: |