2017-03-09 82 views
0

我想知道是否有任何事件發佈時,queue實際上是通過Spring ApiRabbitmq物理創建的。Spring RabbitMq - 隊列創建事件監聽器

我問的原因是某種程度上我們有競爭條件。 queue的訂閱通常需要更長的時間,而訂閱已經發生,從BE發送消息到該隊列,並且因爲結果隊列不存在於Rabbitmq中,並且消息丟失並且永遠不會到達FE。

對不起,我不能提供任何代碼,因爲它通過放一小段代碼不會有多大意義。

但是我很肯定,問題是因爲種族的狀況,隊列中的消息甚至在它被創建之前被髮送。所以如果有一些event listener我可以在創建隊列後收聽,我可以將我的邏輯移至此方法。

下面是一些代碼片段,

stomp-client.js

stompClient.subscribe(destination, function(msg) {}); 

WebsocketConnectionListener.java

@EventListener 
public void handleWebSocketSessionSubscribeEvent(final SessionSubscribeEvent event) { 

// here I think this event is fired before the queue is actual created 
// this event is fired when u send subscription from stomp-client.js 

... 
... 
... 

// trying to send message to this subscribed queue 

simpMessagingTemplate.convertAndSend(TOPIC_PREFIX + destination, data, headers); 
// now this message is lost as sometimes the queue creation takes longer. 
// unfortunately I want to move the convert and send method, when I could listen to queue created event. 

} 

回答

0

沒有公佈的事件,但您可以添加第二個ConnectionListenerCachingConnectionFactory。如果您確定在RabbitAdmin之後添加了它,您可以確定在管理員聲明瞭所有交換,隊列和綁定後將調用onCreate()方法。

請參閱AbstractConnectionFactory.addConnectionListener

+0

我明白了你的意思,但並不是所有的隊列都是在服務器啓動時創建的。大部分隊列是通過從前端發送訂閱動態創建的。根據我的理解,這個新創建的監聽程序不會爲每個隊列通知您以後創建/訂閱的內容,或者我錯了。 –

+0

不清楚你的意思 - 如果你自己動態地創建隊列,那麼你會知道它們被創建 - 這些操作是阻塞的 - 不是異步的 - 使用'RabbitAdmin.declareQueue(queue)'。 –

+0

用一些代碼更新了問題 –