RabbitMQ Stomp over websocket:无法检索排队的消息

时间:2016-02-23 00:21:19

标签: java node.js rabbitmq stomp spring-websocket

我正在使用RabbitMQ Stomp的Durable订阅(文档here)。根据文档,当客户端使用相同的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();
    }
}

我正在执行的步骤:

  • 在客户端运行脚本,它发送订阅请求。
  • 在服务器端创建一个队列(名称为stomp-subscription- *),所有消息都被推送到队列中,客户端可以传输这些消息。
  • 杀死脚本,导致断开连接。服务器日志显示客户端已断开连接,并且消息开始排队。
  • 使用相同的ID再次运行脚本。它以某种方式设法连接到服务器,但是,没有从服务器返回消息。该队列上的消息计数保持不变(同样,RabbitMQ管理控制台不显示该队列的任何使用者)。
  • 10秒后,连接被删除,并在客户端日志上打印出以下内容:
  

糟糕!丢失与&lt;的连接url&gt;

  • 服务器也显示相同的消息(即客户端断开连接)。如客户端代码所示,它尝试在10秒后建立连接,然后再次重复相同的循环。

我尝试了以下事项:

  1. 删除了'ack' : 'client'标题。这会导致所有消息从队列中消失,但是没有消息到达客户端。我在完成this SO回答后添加了此标题。
  2. 在增加messageCount之前,在函数中添加了d.ack();。这会导致服务器端出错,因为它会在会话关闭后(由于断开连接)尝试确认消息。
  3. 此外,在某些情况下,当我重新连接排队的消息数量少于100时,我能够获得所有消息。但是,一旦它超过100,没有任何反应(不确定这是否与问题有关)。

    我不知道服务器端或客户端是否存在问题。有什么输入吗?

1 个答案:

答案 0 :(得分:1)

最后,我能够找到(并修复)这个问题。我们使用nginx作为代理,并将proxy_buffering设置为on(默认值),查看文档here

这就是它所说的:

  

启用缓冲后,nginx会收到代理的响应   服务器尽快将其保存到由设置的缓冲区中   proxy_buffer_size和proxy_buffers指令。

由于这个原因,消息被缓冲(延迟),导致断开连接。我们尝试绕过nginx并且工作正常,然后我们禁用了代理缓冲,它现在似乎工作正常,即使使用nginx代理。