2015-10-04 237 views
1

我正在使用Spring AMQP的MessageListenerContainer从RabbitMq Broker接收消息。尽管我能够在侦听器内部接收消息,但自动装配不在侦听器内部工作。春季Autowiring对RabbitListenerContainer不起作用

这里是如何我已经配置我的听众

@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(消息消息)所有自动装配组件即将变为空。

PS->请注意,我已将所有自动装入实例声明为@Component并执行适当的ComponentScan来适当地扫描其软件包。事实上,这些组件在正常流程中会自动装配,但由于onMessage(消息消息)在单独的线程上执行,因此这些值显示为空。有什么方法可以在侦听器中启用自动装配。

感谢

回答

0

最可能的是,你在你的问题中提到的其他线程没有从Spring的应用程序上下文获得该实例。所以没有注射发生。

你应该在你的onMessage方法使用

@RabbitListener(queues = "queue_name") 

。 但你也应该改变onMessage方法的语法和和

onMessage(Message<String> originalMessage) 

双向弹簧会自动调用该方法与消息

+0

那么,如何让这个线程获得Spring的ApplicationContext? –

+0

我的方法onMessage确实被调用(在一个单独的线程),但问题是我看到所有依赖关系自动装配为null :( –

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 -annotated方法返回,春天将是一个Spring bean和自动装配它。

+0

已经尝试过这..但是这仍然没有工作(再次尝试它以及与你的评论)。换句话说,我在第一次初始化InputQueueEventDispatcher时启用了自动装配(由于@Component,但是在单独的TaskExecutor线程上调用了onMessage(..)方法),我失去了所有自动装配的依赖关系 –