【问题标题】:Transaction manager definition for Spring Integration JMS endpointSpring Integration JMS 端点的事务管理器定义
【发布时间】:2017-02-28 03:43:12
【问题描述】:

在 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"/>

如何将事务管理器添加到我的存在SI Java DSL

Jms.messageDrivenChannelAdapter(...)
                .destination(...)
                .outputChannel(...)
                .errorChannel(errorChannel)
                .autoStartup(false)
                .get();

我不会在这里使用Jms.channel(...) DSL 调用,因为我必须重新设计我的退出流程。

【问题讨论】:

    标签: java spring spring-integration dsl


    【解决方案1】:

    你可以使用下面的sn-p

    @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();
    }
    

    【讨论】:

      【解决方案2】:

      像这样:

      Jms.messageDrivenChannelAdapter(
              Jms.container(this.jmsConnectionFactory, ...)
                  .transactionManager(...)
                  .get())
      

      Jms.messageDrivenChannelAdapter() 接受 AbstractMessageListenerContainer 实现,正如您看到的来自 Jms.container() 工厂的顶级构建器。

      更新

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

      1. 使用Jms.messageDrivenChannelAdapter(AbstractMessageListenerContainer)
      2. DefaultMessageListenerContainer 配置顶级@Bean
      3. 并使用它的setTransactionManager()

      【讨论】:

      • 谢谢,但在我的 SI 1.1.2.RELEASE 版本中没有 transactionManager 方法。我应该使用什么版本?
      • 好吧,谢谢您可以JmsListenerContainerSpec.get() 并致电setTransactionManager()。考虑升级到1.2spring.io/blog/2016/10/14/…。 (您没有在问题中提及版本...)
      • 我无法使用简单升级到1.2.0 版本的解决方案,因为它需要将其他Springs 的库升级到4.3.4,这样的升级会给我们的代码带来其他问题。那么是否有可能以某种方式在1.1.2.RELEASE 中指定transactionManager
      • 我说你:JmsListenerContainerSpec.get() 并直接致电AbstractPollingMessageListenerContainer.setTransactionManager()。您仍然可以为spec 指定任何其他选项。 SI-4.3.4 你还有什么问题?
      • 在我的回答中查看更新。
      猜你喜欢
      • 2015-02-28
      • 2017-12-12
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      • 1970-01-01
      • 2016-05-17
      • 2012-03-21
      • 1970-01-01
      相关资源
      最近更新 更多