拆分后如何使对服务激活器的调用具有事务性

时间:2018-12-19 23:42:27

标签: spring-integration spring-integration-dsl

我正在使用以下方法定义集成流程:

@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 :(得分:1)

您的问题还不清楚,但是您绝对需要考虑将事务添加到服务激活器中。尽管您没有显示该android { ... packagingOptions { exclude 'lib/x86/libsupportjni.so' exclude 'lib/x86_64/libsupportjni.so' exclude 'lib/armeabi-v7a/libsupportjni.so' exclude 'lib/arm64-v8a/libsupportjni.so' } ... } 的订阅者,但是您需要考虑没有几个订阅者。

尽管如此,我认为您的意思是将TX应用于此taskSourceChannel上的服务激活器及其后的所有内容。

为此,Spring Integration提供了taskSourceChannel。有关更多信息,请参见参考手册:https://docs.spring.io/spring-integration/reference/html/messaging-endpoints-chapter.html#tx-handle-message-advice

TransactionHandleMessageAdvice仅在TransactionSynchronizationFactory实现中使用。但是,您仍然可以依靠AbstractPollingEndpoint在交易环境中使用它。