当前位置: 首页 > 知识库问答 >
问题:

迁移JMS事件的正确最终方法,监听Spring集成和Spring Boot

郎诚
2023-03-14

我有一个JmsConfig配置类,它通过以下方式处理来自主题的JMS事件:

  • 它定义了一个@Bean ConnectionFactory,其中包含一个ActiveMQ实现
  • 它定义了一个@Bean JmsListenerContainerFactory实例化一个DefaultJmsListenerContainerFactory,并通过Boot的DefaultJmsListenerContainerFactoryConfigurer
  • 它定义了一个@Bean MessageConverter,其中包含一个映射Jackson2MessageConverter,并设置一个自定义对象映射器
  • 我在我的服务方法上使用了指向myfactory的@JmsListener注释。这是我对这个主题的唯一用途,仅限订阅

现在我想转到Spring集成。在阅读了大量内容之后,如果我不需要双向使用(丢弃网关)或轮询机制(丢弃@InboundChannelAdapter),我将使用传统的XML配置措辞,选择一个消息驱动的通道适配器。我发现Java习语应该通过新的Spring Integration DSL库来实现,因此,我寻找合适的代码片段。

似乎JmsMessageDrivenChannelAdapter是正确的等价物,我找到了一种方法:

IntegrationFlows。来自(Jms.messageDriverChannelAdapter(…))

但问题是,它只接受ActiveMQ连接工厂或AbstractMessageListenerContainer,而不接受my boot预配置的JmsListenerContainerFactory

如何最终实现这一点?


共有2个答案

尹冠宇
2023-03-14

甚至还有一个更好的方法。我很惊讶Gary没有评论它。有一个开箱即用的构建器叫做Jms.container(...)

@Bean
public IntegrationFlow jmsMyServiceMsgInboundFlow(ConnectionFactory connectionFactory, MessageConverter jmsMessageConverter, MyService myService, JmsProperties jmsProperties, @Value("${mycompany.jms.destination.my-topic}") String topicDestination){

      JmsProperties.Listener jmsInProps = jmsProperties.getListener();

      return IntegrationFlows.from(
                                Jms.messageDrivenChannelAdapter(  Jms.container(connectionFactory, topicDestination)
                                                                     .pubSubDomain(false)
                                                                     .sessionAcknowledgeMode(jmsInProps .getAcknowledgeMode().getMode())
                                                                     .maxMessagesPerTask(1)
                                                                     .errorHandler(e -> e.printStackTrace())
                                                                     .cacheLevel(0)
                                                                     .concurrency(jmsInProps.formatConcurrency())
                                                                     .taskExecutor(Executors.newCachedThreadPool())
                                                                     .get()))
                                   )
                                   .extractPayload(true)
                                   .jmsMessageConverter(jmsMessageConverter)
                                   .destination(topicDestination)
                                   .autoStartup(true)
                                    //.errorChannel("NOPE")
                             )
                             .log(LoggingHandler.Level.DEBUG)
                             .log()
                             .handle(myService, "myMethod", e -> e.async(true).advice(retryAdvice()))
                             .get();
岳奇逸
2023-03-14

JmsListenerContainerFactory是特定于@JmsListener的,它是用于配置DefaultMessageListenerContainer的更高级别抽象。Boot不为原始DefaultMessageListenerContainer提供自动配置选项;你得自己接线。但你仍然可以使用启动属性。。。

@Bean
public IntegrationFlow flow(ConnectionFactory connectionFactory, 
                            JmsProperties properties) {
    return IntegrationFlows.from(Jms.messageDrivenChannelAdapter(container(connectionFactory, properties)))
            ...
            .get();
}

private DefaultMessageListenerContainer container(ConnectionFactory connectionFactory, 
                                                  JmsProperties properties) {
    DefaultMessageListenerContainer container = new DefaultMessageListenerContainer();
    container.setConcurrentConsumers(properties.getListener().getConcurrency());
    container.setMaxConcurrentConsumers(properties.getListener().getMaxConcurrency());
    ...
    return container;
}
 类似资料:
  • ap.offPagePause(CALLBACK) 移除 pagePause 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</but

  • ap.offPageResume(CALLBACK) 移除 pageResume 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</b

  • ap.offResume(CALLBACK) 移除 resume 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</button> <

  • ap.offPause(CALLBACK) 移除 pause 事件的监听。 代码示例 <script src="https://gw.alipayobjects.com/as/g/h5-lib/alipayjsapi/3.1.1/alipayjsapi.inc.min.js"></script> <button class="btn btn-default">打开新页面</button> <sc

  • 本文向大家介绍vue监听滚动事件的方法,包括了vue监听滚动事件的方法的使用技巧和注意事项,需要的朋友参考一下 vue中监听滚动事件,然后对其进行事件处理,一般有:1. 滚动到顶部吸附; 2. 根据滚动的位置激活对应的tab键(锚链接tab键) 这两种方式的处理都是可通过监听scroll来实现 处理方法 1. 滚动到顶部吸附 html元素 methods方法 2. 根据滚动的位置激活对应的tab键

  • 我试图弄清楚如何以及何时从部署在Docker群中的Docker容器运行mybatis模式迁移。我的意思是:我需要最正确的方法来做到这一点。 目前,我们从Dockerfile构建Docker容器 然后开始。sh脚本包含 但是通过这种方式,我们必须从Ubuntu构建一个映像,安装Maven,并在迁移开始时使用“硬编码”环境。sh文件,因此我们需要来自不同环境的不同文件。 您认为在构建/部署过程中运行这