我正在阅读有关如何启动spring-jms应用程序的官方入门文章
https://spring.io/guides/gs/messaging-jms/
@EnableJms触发发现带有注释的方法
@JmsListener,在以下位置创建消息侦听器容器
盖子。
但是我的应用程序看到没有@JmsListener
批注的@EnableJms
方法。
也许还有其他一些因素迫使Spring搜索@EnableJms
方法。我想知道
项目结构:
听众:
@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);
}
}
RabbitJms应用程序:
@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;
}
}
最佳答案
感谢您的反馈。确实,这有点令人困惑,我创建了an issue来改进示例。@EnableJms
是开始处理侦听器的框架信号,必须明确,因为框架无法知道您要使用JMS。
另一方面,Spring Boot可以根据上下文为您做出默认决策。如果您有必要的位置来创建ConnectionFactory
,它将这样做。在将来,如果我们检测到ConnectionFactory
可用,则将自动启用对JMS侦听器的处理。