我正在使用Spring AMQP的MessageListenerContainer来接收来自RabbitMq Broker的消息。虽然我能够在监听器内接收消息,但自动装配在监听器内部无效。
以下是我配置监听器的方法
@Bean
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(this.inputQueueMgr
.getRabbitConnectionFactory());
JsonMessageConverter converter = new JsonMessageConverter();
listenerContainer.setMessageConverter(converter);
listenerContainer.setMessageListener(new InputQueueEventDispatcher());
listenerContainer.setQueueNames("queue1");
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
listenerContainer.setPrefetchCount(1);
return listenerContainer;
}
这是我正在收听来自rabbitMq
的消息的类@Component(value = "inputMessageListner")
public class InputQueueEventDispatcher implements Serializable, MessageListener {
private static final long serialVersionUID = -5391659256992655430L;
@Autowired
private volatile InputQueueManagerImpl inputQueueMgr;
@Autowired
private volatile NotificationQueueManagerImpl notificationManager;
@Value("${input.rabbitmq.events.queue}")
private String queueName;
@Autowired
private SubscriptionRepository subRepository;
@SuppressWarnings({ "unchecked" })
@Override
public void onMessage(Message message) {
try {
String messageContent = new String(message.getBody());
.....
}
问题出在onMessage(消息消息)里面,所有的autowire组件都是null。
PS->请注意,我已将所有autowire实例声明为@Component,并使用适当的ComponentScan来正确扫描其包。事实上,这些组件确实在正常流程中自动装配,但由于onMessage(消息消息)在单独的线程上执行,因此这些值显示为null。有没有办法在侦听器内启用自动装配。
由于
答案 0 :(得分:1)
您在侦听器上设置了@Component注释,但是您没有从上下文中获取此bean。相反,您使用new
自己创建实例。所以Spring无法知道这个实例已经创建并且必须自动装配。
删除@Component
注释,然后将代码更改为
@Bean
public SimpleMessageListenerContainer listenerContainer() {
SimpleMessageListenerContainer listenerContainer = new SimpleMessageListenerContainer();
listenerContainer.setConnectionFactory(this.inputQueueMgr
.getRabbitConnectionFactory());
JsonMessageConverter converter = new JsonMessageConverter();
listenerContainer.setMessageConverter(converter);
listenerContainer.setMessageListener(inputMessageListener());
listenerContainer.setQueueNames("queue1");
listenerContainer.setAcknowledgeMode(AcknowledgeMode.AUTO);
listenerContainer.setPrefetchCount(1);
return listenerContainer;
}
@Bean
public InputQueueEventDispatcher inputMessageListener() {
return new InputQueueEventDispatcher();
}
现在,由于bean是从@Bean
注释的方法返回的,因此Spring会生成一个Spring bean并自动装配它。
答案 1 :(得分:-1)
很可能你在问题中提到的另一个主题是没有从spring的应用程序上下文中获取该实例。所以没有注射它。
你应该使用
@RabbitListener(queues = "queue_name")
你的onMessage方法上的。 但是你也应该改变onMessage方法语法和
onMessage(Message<String> originalMessage)
这样spring会自动用消息
调用该方法