Как сделать звонок в активатор услуги транзакционным после сплита

Я использую следующее, чтобы определить свой поток интеграции:

@Bean
public IntegrationFlow pollingFlow(MessageSource<Object> jdbcMessageSource)    {
    return IntegrationFlows.from(jdbcMessageSource,
            c -> c.poller(Pollers.fixedRate(250, TimeUnit.MILLISECONDS)
                    .maxMessagesPerPoll(1)
                    .transactional()))
            .split()
            .channel(taskSourceChannel())
            .get();
}

Я хочу вызвать активатор службы, который читает из taskSourceChannel как транзакционный. Кроме того, я хочу использовать подписку для своей транзакции.

@Bean
public TransactionSynchronizationFactory transactionSynchronizationFactory() {
    ExpressionEvaluatingTransactionSynchronizationProcessor syncProcessor
            = new ExpressionEvaluatingTransactionSynchronizationProcessor();
    syncProcessor.setAfterCommitChannel(successChannel());
    syncProcessor.setAfterRollbackChannel(failureChannel());
    return new DefaultTransactionSynchronizationFactory(syncProcessor);
}

TaskSourceChannel - это канал исполнителя.

@Bean
public MessageChannel taskSourceChannel() {
    return new ExecutorChannel(executor());
}

Как я могу добавить поддержку транзакций после разделения при использовании TransactionSynchronizationFactory. Я не хочу, чтобы опрос был трансакционным. Единственное решение, которое я могу придумать, - это поставить транзакцию на активатор, но это не решит мою проблему. Хотелось бы сделать его применимым к любому активатору сервиса, использующему этот канал.


person Learner    schedule 19.12.2018    source источник


Ответы (1)


Ваш вопрос не так понятен, но вам обязательно нужно подумать о добавлении транзакции в активатор услуги. Хотя вы не показываете, какой подписчик для этого taskSourceChannel, но вам нужно подумать, что у него нет нескольких подписчиков.

Тем не менее, я думаю, что ваша цель - применить TX к активатору услуг на этом taskSourceChannel и во всем, что после этого.

Для этой цели Spring Integration предоставляет TransactionHandleMessageAdvice. См. Дополнительную информацию в Справочном руководстве: https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#tx-handle-message-advice.

TransactionSynchronizationFactory используется только в реализациях AbstractPollingEndpoint. Однако вы все равно можете использовать его в транзакционном контексте, полагаясь на TransactionSynchronizationManager.registerSynchronization().

person Artem Bilan    schedule 20.12.2018