如何处理 Spring 集成流的事务(Java DSL)

Posted

技术标签:

【中文标题】如何处理 Spring 集成流的事务(Java DSL)【英文标题】:How to handle transactions for Spring integration flows (Java DSL) 【发布时间】:2018-09-28 08:28:18 【问题描述】:

如何在 Spring 集成 (Java DSL) 中为完整流程定义事务?

通过 Spring 集成,我们可以定义一个示例流程:

@Bean
public IntegrationFlow myMessageFromMessageAmqpInboundFlow() 
    return IntegrationFlows.from(myInboundChannel)
            .transform(aMessageTransformer)
            .transform(anotherMessageTransformer)
            .channel(anOutputChannel)
            .get();

我需要一个跨越整个流程的事务。目前,当我使用“aMessageTransformer”访问数据库时,在处理完此消息转换器后,事务将关闭。 但我需要一个在处理“anotherMessageTransformer”时仍未提交的事务?

我希望我只需要添加一个“@Transactional”(或 @Transactional(propagation = Propagation.REQUIRED, readOnly = true))

@Bean
@Transactional
public IntegrationFlow myMessageFromMessageAmqpInboundFlow() 
    return IntegrationFlows.from(myInboundChannel)
            .transform(aMessageTransformer)
            .transform(anotherMessageTransformer)
            .channel(anOutputChannel)
            .get();

但这会导致“anotherMessageTransformer”中出现“无会话异常”

【问题讨论】:

首先,你的消息流是否发生在同一个线程中? 【参考方案1】:

您需要关注此documentation,因此将其添加到您的流程中:

.transform(aMessageTransformer, e -> e.transactional(true))

.transactional() 在哪里:

/**
 * Specify a @link TransactionInterceptor @link Advice with default
 * @code PlatformTransactionManager and @link DefaultTransactionAttribute for the
 * @link MessageHandler.
 * @param handleMessageAdvice the flag to indicate the target @link Advice type:
 * @code false - regular @link TransactionInterceptor; @code true -
 * @link org.springframework.integration.transaction.TransactionHandleMessageAdvice
 * extension.
 * @return the spec.
 */
public S transactional(boolean handleMessageAdvice) 

TransactionHandleMessageAdvice 表示:

* When this @link Advice is used from the @code request-handler-advice-chain, it is applied
 * to the @link MessageHandler#handleMessage
 * (not to the
 * @link org.springframework.integration.handler.AbstractReplyProducingMessageHandler.RequestHandler#handleRequestMessage),
 * therefore the entire downstream process is wrapped to the transaction.

【讨论】:

以上是关于如何处理 Spring 集成流的事务(Java DSL)的主要内容,如果未能解决你的问题,请参考以下文章

如何处理来自 WASAPI 流的声音数据块而不将它们写入文件?

如何处理来自 websocket 流的数据并有条件地在 Azure Bot 中发送主动消息?

网页显示无法打开JDBC连接事务;嵌套异常java.sql.SQLException:无法连接、 如何处理这种问题

微服务架构的分布式事务问题如何处理?

数据库日志已满,如何处理?

数据库日志已满,如何处理?