该版本仍在开发中,尚未被视为稳定。对于最新的稳定版本,请使用 Spring Integration 7.0.0spring-doc.cadn.net.cn

交易支持

从5.0版本开始,一个新的交易处理消息建议被引入以使整个下游流程成为交易性,这得益于HandleMessageAdvice实现。 当他成为常规成员时交易拦截者用于<请求-处理-建议链>元素(例如,通过配置<tx:建议>),初始事务仅应用于内部摘要回复ProducingMessageHandler.handleRequestMessage()并且不会传播到下游流。spring-doc.cadn.net.cn

为了简化XML配置,同时<请求-处理-建议链>一个<交易性>元素已被添加到所有<出站网关><服务激活器>以及相关组件。 以下示例显示<交易性>使用情况:spring-doc.cadn.net.cn

<int-jdbc:outbound-gateway query="select * from things where id=:headers[id]">
        <int-jdbc:transactional/>
</int-jdbc:outbound-gateway>

<bean id="transactionManager" class="org.mockito.Mockito" factory-method="mock">
    <constructor-arg value="org.springframework.transaction.TransactionManager"/>
</bean>

如果你熟悉JPA集成组件,这种配置并不新鲜,但现在我们可以从流程中的任何节点开始交易——而不仅仅是从<poller>或者是消息驱动的通道适配器,如JMS。spring-doc.cadn.net.cn

Java 配置可以通过使用交易拦截构建器,结果豆名可用于消息注释 建议链属性,如下例所示:spring-doc.cadn.net.cn

@Bean
public ConcurrentMetadataStore store() {
    return new SimpleMetadataStore(hazelcastInstance()
                       .getMap("idempotentReceiverMetadataStore"));
}

@Bean
public IdempotentReceiverInterceptor idempotentReceiverInterceptor() {
    return new IdempotentReceiverInterceptor(
            new MetadataStoreSelector(
                    message -> message.getPayload().toString(),
                    message -> message.getPayload().toString().toUpperCase(), store()));
}

@Bean
public TransactionInterceptor transactionInterceptor() {
    return new TransactionInterceptorBuilder(true)
                .transactionManager(this.transactionManager)
                .isolation(Isolation.READ_COMMITTED)
                .propagation(Propagation.REQUIRES_NEW)
                .build();
}

@Bean
@org.springframework.integration.annotation.Transformer(inputChannel = "input",
         outputChannel = "output",
         adviceChain = { "idempotentReceiverInterceptor",
                 "transactionInterceptor" })
public Transformer transformer() {
    return message -> message;
}

注意true参数交易拦截构建器构造 函数。 它导致交易处理消息建议,不是常规交易拦截者.spring-doc.cadn.net.cn

Java DSL 支持建议通过.transactional()端点配置中的选项,如下示例所示:spring-doc.cadn.net.cn

@Bean
public IntegrationFlow updatingGatewayFlow() {
    return f -> f
        .handle(Jpa.updatingGateway(this.entityManagerFactory),
                e -> e.transactional(true))
        .channel(c -> c.queue("persistResults"));
}