我有多个模块,它们通过消息队列(Spring Rabbit)相互通信。一些模块产生消息,而另一些消耗它们。但是,单个模块可以侦听不同的队列,因此在列表中有一个队列名称列表,因此我为每个队列名称创建了一个SimpleMessageListenerContainer
,如下所示。
public void build() {
for (String queueName: queues) {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(connectionFactory());
listenerContainer.setQueueNames(queueName);
listenerContainer.setMessageListener(listenerAdapter());
}
}
@Bean
private MessageListenerAdapter listenerAdapter() {
return new MessageListenerAdapter(new MessageListener() {
@Override
public void onMessage(Message message) {
System.out.println(message.getBody());
}
}, "onMessage");
}
此实现对我不起作用,使用者未在队列中注册,执行期间抛出任何错误或异常。
注意:我使用的是Spring,并且仅限于不使用
@RabbitListener
之类的注释 最佳答案
当手动声明SimpleMessageListenerContainer
而不是将其声明为bean时,还必须确保应用程序上下文回调和生命周期:
listenerContainer.setApplicationContext()
listenerContainer.setApplicationEventPublisher()
listenerContainer.afterPropertiesSet()
listenerContainer.start()
并且不要忘了在应用程序结尾使用
stop()
和destroy()
它们。