[英]Does Spring Cloud Stream support RabbitMQ Stomp over Websocket
[英]RabbitMQ Stomp over websocket : Unable to retrieve queued messages
我正在使用RabbitMQ Stomp的持久訂閱( 此處的文檔)。 根據文檔,當客戶端使用相同的ID重新連接(訂閱)時,他應該獲得所有排隊的消息。 但是,即使消息在服務器端排隊,我也無法收回任何東西。 下面是我正在使用的代碼:
RabbitMQ版本:3.6.0
客戶代碼:
var sock;
var stomp;
var messageCount = 0;
var stompConnect = function() {
sock = new SockJS(options.url);
stomp = Stomp.over(sock);
stomp.connect({}, function(frame) {
debug('Connected: ', frame);
console.log(frame);
var id = stomp.subscribe('<url>' + options.source + "." + options.type + "." + options.id, function(d) {
console.log(messageCount);
messageCount = messageCount + 1;
}, {'auto-delete' : false, 'persistent' : true , 'id' : 'unique_id', 'ack' : 'client'});
}, function(err) {
console.log(err);
debug('error', err, err.stack);
setTimeout(stompConnect, 10);
});
};
服務器代碼:
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
@Override
public void configureMessageBroker(final MessageBrokerRegistry config) {
config.enableStompBrokerRelay("<endpoint>", "<endpoint>").setRelayHost(host)
.setSystemLogin(username).setSystemPasscode(password).setClientLogin(username)
.setClientPasscode(password);
}
@Override
public void registerStompEndpoints(final StompEndpointRegistry registry) {
registry.addEndpoint("<endpoint>").setAllowedOrigins("*").withSockJS();
}
}
我正在執行的步驟:
哎呦! 與<URL>的連接斷開
我嘗試了以下操作:
'ack' : 'client'
頭。 這導致所有消息都從隊列中耗盡,但是沒有消息到達客戶端。 經過這個 SO答案后,我添加了此標頭。 d.ack();
在函數中,在遞增messageCount之前。 這會導致服務器端出錯,因為它在會話關閉后(由於斷開連接)試圖確認消息。 另外,在某些情況下,當我重新排隊的郵件數少於100時,我就能獲得所有郵件。 但是,一旦超過100,就什么也沒發生(不確定是否與問題有關)。
我不知道問題是否存在於服務器端或客戶端。 有輸入嗎?
最后,我能夠找到(並解決)該問題。 我們使用nginx作為代理,並且將proxy_buffering
設置為on
(默認值),請參閱此處的文檔。
它是這樣說的:
啟用緩沖后,nginx會盡快從代理服務器收到響應,並將其保存到proxy_buffer_size和proxy_buffers指令設置的緩沖區中。
因此,郵件被緩沖(延遲),導致斷開連接。 我們嘗試繞過nginx並正常工作,然后禁用代理緩沖,即使使用nginx代理,它現在似乎也可以正常工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.