如果我没有标记@EnableJms注释的类,Spring如何查找@EnableJms方法?

时间:2017-08-21 11:31:13

标签: java spring spring-boot rabbitmq spring-jms

我正在阅读有关如何启动spring-jms应用程序的官方入门文章

https://spring.io/guides/gs/messaging-jms/

  

@EnableJms触发发现带注释的方法   @JmsListener,在下创建消息监听器容器   覆盖。

但我的应用程序看到@JmsListener方法没有@EnableJms注释。

也许其他东西强迫Spring搜索@EnableJms方法。我想知道。

项目结构:

enter image description here

监听器:

@Component
public class Listener {

    @JmsListener(destination = "my_queue_new")
    public void receive(Email email){
        System.out.println(email);
    }
    @JmsListener(destination = "my_topic_new", containerFactory = "myFactory")
    public void receiveTopic(Email email){
        System.out.println(email);
    }
}

RabbitJmsApplication:

@SpringBootApplication
//@EnableJms  I've commented it especially, behaviour was not changed.
public class RabbitJmsApplication {

    public static void main(String[] args) {
        SpringApplication.run(RabbitJmsApplication.class, args);
    }

    @Bean
    public RMQConnectionFactory connectionFactory() {
        return new RMQConnectionFactory();
    }

    @Bean
    public JmsListenerContainerFactory<?> myFactory(DefaultJmsListenerContainerFactoryConfigurer configurer, ConnectionFactory connectionFactory) {
        DefaultJmsListenerContainerFactory factory = new DefaultJmsListenerContainerFactory();
        // This provides all boot's default to this factory, including the message converter
        configurer.configure(factory, connectionFactory);
        // You could still override some of Boot's default if necessary.
        factory.setPubSubDomain(true);
        return factory;
    }
}

1 个答案:

答案 0 :(得分:3)

感谢您的反馈。这确实有点令人困惑,我已创建an issue来改进样本。

@EnableJms是一个开始处理侦听器的框架信号,它必须是显式的,因为框架无法知道你想要使用JMS。

另一方面,Spring Boot可以根据上下文为您做出默认决策。如果您有必要的位来创建ConnectionFactory,它将会这样做。接下来,如果我们检测到ConnectionFactory可用,我们将自动启用JMS侦听器的处理。