2015-10-04 241 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(..)方法),我失去了所有自動裝配的依賴關係 –