У меня есть этот вариант использования.
Первая цепочка:
<int:chain input-channel="inserimentoCanaleActivate" output-channel="inserimentoCanalePreRouting">
<int:service-activator ref="inserimentoCanaleActivator" method="activate" />
</int:chain>
Это относительный код:
@Override
@Transactional(propagation = Propagation.REQUIRES_NEW)
public EventMessage<ModificaOperativitaRapporto> activate(EventMessage<InserimentoCanale> eventMessage) {
...
// some Database changes
dao.save(myObject);
}
Все отлично работает.
Тогда у меня есть другая цепочка:
<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>
И относительный активатор:
@Override
public EventMessage<CensimentoCliente> activate(EventMessage<CensimentoCliente> eventMessage) {
...
// some Database changes
dao.save(myObject);
}
Полезная нагрузка CensimentoCliente
, как описано ниже, имеет List
полезной нагрузки первогоцепочка, поэтому с помощью сплиттера я делю список и повторно использую код первой цепочки.
public interface CensimentoCliente extends Serializable {
Collection<? extends InserimentoCanale> getCanali();
void setCanali(Collection<? extends InserimentoCanale> canali);
...
}
Но поскольку каждый активатор получает определение транзакции (поскольку первый может жить без второго), яесть сценарий использования, в котором транзакции разделены.
Цель состоит в том, чтобы модификации базы данных двух цепочек были частью одной транзакции.
Любая помощь?
С уважением, Массимо