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

Whi*_*cal 1 spring jms spring-integration spring-jms spring-boot

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

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

现在我想转到Spring Integration。在阅读了很多之后,如果我不需要双向使用(丢弃网关)也不需要轮询机制(丢弃@InboundChannelAdapter),我将寻求一个message-driven-channel-adapter传统的 XML 配置措辞。我发现 Java 习惯用法应该通过新的 Spring Integration DSL 库来完成,因此,我寻找合适的代码片段。

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

IntegrationFlows.from(Jms.messageDriverChannelAdapter(...))

但问题是这仅接受 ActiveMQ ConnectionFactory 或AbstractMessageListenerContainer,但没有我的引导预配置JmsListenerContainerFactory!

这应该如何以最终方式实施?

Gar*_*ell 5

JmsListenerContainerFactory特定于@JmsListener,它是用于配置DefaultMessageListenerContainer. Boot 不为 raw 提供自动配置选项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;
}
Run Code Online (Sandbox Code Playgroud)