Поскольку у вас есть реализация JdbcSourceUpdate
, достаточно просто сделать следующее:
@Transactional(propagation = Propagation.REQUIRES_NEW)
@Override
public void handleMessage(Message<?> message) throws MessagingException {
Для получения дополнительной информации см. JavaDocs:
/**
* Create a new transaction, and suspend the current transaction if one exists.
* Analogous to the EJB transaction attribute of the same name.
* <p><b>NOTE:</b> Actual transaction suspension will not work out-of-the-box
* on all transaction managers. This in particular applies to
* {@link org.springframework.transaction.jta.JtaTransactionManager},
* which requires the {@code javax.transaction.TransactionManager} to be
* made available to it (which is server-specific in standard Java EE).
* @see org.springframework.transaction.jta.JtaTransactionManager#setTransactionManager
*/
REQUIRES_NEW(TransactionDefinition.PROPAGATION_REQUIRES_NEW),
ОБНОВЛЕНИЕ
Обратите внимание на ПРИМЕЧАНИЕ, хотя:
* Actual transaction suspension will not work out-of-the-box
* on all transaction managers. This in particular applies to
* {@link org.springframework.transaction.jta.JtaTransactionManager}`.
Итак, звучит как DataSourceTransactionManager
не работает с подвеской.Я могу предложить вам использовать .gateway()
для этого JdbcSourceUpdate
, но с использованием ExecutorChannel
.Таким образом, ваш handle(jdbcSourceUpdate()
будет выполнен в новом потоке и, следовательно, с новой транзакцией.Основной поток будет ожидать ответа от того шлюза, в котором была открыта его транзакция.
Примерно так:
.subscribe(f -> f
.gateway(subFlow ->
subFlow.channel(c -> c.executor())
.handle(jdbcMessageHandler()))
.channel("nullChannel")
));
Купите ваш JdbcSourceUpdate
для возврата ответа шлюза.Предположим, что вы не реализовали MessageHandler
там, а сделали просто как обычный POJO с одним не void
методом.