我想知道是否有任何事件發佈時,queue
實際上是通過Spring Api
在Rabbitmq
物理創建的。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.
}
我明白了你的意思,但並不是所有的隊列都是在服務器啓動時創建的。大部分隊列是通過從前端發送訂閱動態創建的。根據我的理解,這個新創建的監聽程序不會爲每個隊列通知您以後創建/訂閱的內容,或者我錯了。 –
不清楚你的意思 - 如果你自己動態地創建隊列,那麼你會知道它們被創建 - 這些操作是阻塞的 - 不是異步的 - 使用'RabbitAdmin.declareQueue(queue)'。 –
用一些代碼更新了問題 –