Как сделать звонок активатору сервиса транзакционным после разделения - PullRequest
0 голосов
/ 20 декабря 2018

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

@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.Я не хочу, чтобы опрос был транснациональным.Единственное решение, которое я могу придумать, - это установить транзакционный активатор, но это не решит мою проблему.Я хотел бы сделать его применимым к любому активатору службы, использующему этот канал.

1 Ответ

0 голосов
/ 20 декабря 2018

Ваш вопрос не так понятен, но вам обязательно нужно подумать о том, чтобы добавить транзакцию в активатор службы.Хотя вы не показываете, кто является подписчиком для этого 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().

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...