You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Spring Integration结合JMS入站的事务提交后消息处理问题

Spring Integration JMS入站事务管理与发送后消息操作问题

我正尝试深入理解Spring Integration结合JMS入站的事务管理机制。查阅文档后找到文件轮询的提交后操作相关资料,但尚未找到JMS场景下的类似实现方法。

基础「读入-写出」流程定义

@Bean
public IntegrationFlow inOutFlow() {
    return IntegrationFlows
            .from(Jms.messageDrivenChannelAdapter(connectionFactory)
                    .destination(new ActiveMQQueue("inQueue")))
            .handle(Jms.outboundAdapter(connectionFactory)
                    .destination("outQueue"))
            .get();
}

核心疑问

如何在消息发送至出站队列后对SI消息进行操作?

已添加事务管理器的配置

我已为流程添加了transactionManager:

@Bean
public IntegrationFlow inOutFlow() {
    return IntegrationFlows
            .from(Jms.messageDrivenChannelAdapter(connectionFactory)
                    .destination(new ActiveMQQueue("inQueue"))
                    .configureListenerContainer(c -> c.sessionTransacted(true)
                            .transactionManager(jmsTransactionManager)))
            .handle(Jms.outboundAdapter(connectionFactory).destination("outQueue"))
            .get();
}

@Bean
public JmsTransactionManager jmsTransactionManager(ConnectionFactory connectionFactory) {
    var manager = new JmsTransactionManager(connectionFactory);
    manager.setTransactionSynchronization(AbstractPlatformTransactionManager.SYNCHRONIZATION_ON_ACTUAL_TRANSACTION);
    return manager;
}

文件轮询示例底层使用带有ExpressionEvaluatingTransactionSynchronizationProcessor的TransactionSynchronizationFactory,但configureListenerContainer方法无类似配置选项。

编辑:引入可轮询通道后的尝试

我按建议引入了可轮询通道:

@Bean
public IntegrationFlow inFlow() {
    return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(connectionFactory)
                    .destination(new ActiveMQQueue("inQueue")))
            .channel("queueChannel")
            .get();
}

@Bean
public MessageChannel queueChannel() {
    return MessageChannels.queue().get();
}

@Bean
public IntegrationFlow outFlow() {
    return IntegrationFlows.from("queueChannel")
                    .handle(Jms.outboundAdapter(connectionFactory)
                               .destination("outQueue"))
                    .get();
}

消息发送至中间通道时会启动新线程,ActiveMQ消息被消费移除,但SI消息内容仍可用于后续处理。


内容的提问来源于stack exchange,提问作者Marc Tarin

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 16:27:26