Spring自动装配不适用于RabbitListenerContainer

时间:2015-10-04 19:33:32

标签: spring spring-amqp spring-rabbit spring-rabbitmq

我正在使用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。有没有办法在侦听器内启用自动装配。

由于

2 个答案:

答案 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会自动用消息

调用该方法