Java Spring集成JMS端点的事务管理器定义

Java Spring集成JMS端点的事务管理器定义,java,spring,spring-integration,dsl,Java,Spring,Spring Integration,Dsl,在Spring Integration中,XML DSL能够为JMS消息驱动通道适配器指定事务管理器: <int-jms:message-driven-channel-adapter id="..." connection-factory="..." destination="..." channel="..." error-channel="errorChannel" transaction-manager="processTransact

在Spring Integration中,XML DSL能够为JMS消息驱动通道适配器指定事务管理器:

<int-jms:message-driven-channel-adapter id="..."
        connection-factory="..." destination="..."
        channel="..." error-channel="errorChannel"
        transaction-manager="processTransactionManager" auto-startup="false"/>
我不会在这里使用
Jms.channel(…)
DSL调用,因为我必须修改退出流程。

如下:

Jms.messageDrivenChannelAdapter(
        Jms.container(this.jmsConnectionFactory, ...)
            .transactionManager(...)
            .get())
Jms.messageDrivenChannelAdapter()
来接受
AbstractMessageListenerContainer
实现,正如您从
Jms.container()工厂看到的顶级生成器一样

更新

对于SI Java DSL
1.1.x
,解决方法如下:

  • 使用Jms.messageDrivenChannelAdapter(AbstractMessageListenerContainer)
  • DefaultMessageListenerContainer
  • 并使用其
    setTransactionManager()

  • 您可以使用以下代码段

    @Bean
    PlatformTransactionManager transactionManager(
        ConnectionFactory connectionFactory) {
        return new JmsTransactionManager(connectionFactory);
    }
    
    @Bean
    JmsInboundGateway jmsInboundGateway(
        ConnectionFactory connectionFactory,
        MessageChannel errorChannel,
        PlatformTransactionManager transactionManager) {
    
        return Jms
            .inboundGateway(
                Jms.container(connectionFactory, "process-input")
                    .transactionManager(transactionManager)
                    .get()
                )
            .requestChannel(processingInputChannel())
            .defaultReplyQueueName("process-output")
            .replyChannel(processingOutputChannel())
            .errorChannel(errorChannel)
            .get();
    }
    

    谢谢,但是在我的SI
    1.1.2.RELEASE
    版本中没有
    transactionManager
    方法。我应该使用什么版本?好的,谢谢你可以
    JmsListenerContainerSpec.get()
    并调用
    setTransactionManager()
    。考虑升级到<代码> 1.2 <代码>:。(您在问题中没有提到版本…)我无法使用简单升级到
    1.2.0
    版本的解决方案,因为它需要将其他Spring的LIB升级到
    4.3.4
    ,这样的升级会给我们的代码带来其他问题。那么,是否可以在
    1.1.2.RELEASE
    中指定
    transactionManager
    ?我说的是:
    JmsListenerContainerSpec.get()
    并直接调用
    AbstractPollingMessageListenerContainer.setTransactionManager()。您仍然可以为
    规范
    指定任何其他选项。您对SI-4.3.4有哪些其他问题?请参阅我答案中的更新。
    @Bean
    PlatformTransactionManager transactionManager(
        ConnectionFactory connectionFactory) {
        return new JmsTransactionManager(connectionFactory);
    }
    
    @Bean
    JmsInboundGateway jmsInboundGateway(
        ConnectionFactory connectionFactory,
        MessageChannel errorChannel,
        PlatformTransactionManager transactionManager) {
    
        return Jms
            .inboundGateway(
                Jms.container(connectionFactory, "process-input")
                    .transactionManager(transactionManager)
                    .get()
                )
            .requestChannel(processingInputChannel())
            .defaultReplyQueueName("process-output")
            .replyChannel(processingOutputChannel())
            .errorChannel(errorChannel)
            .get();
    }