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
相关产品推荐
相关产品推荐

