java - RabbitMQ Stomp 通过 websocket : Unable to retrieve queued messages

标签 java node.js rabbitmq stomp spring-websocket

我正在使用 RabbitMQ Stomp 的持久订阅(文档 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 秒后,连接断开,并在客户端日志上打印以下内容:

Whoops! Lost connection to < url >

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

我尝试过以下操作:

  1. 删除了 'ack' : 'client' header 。这会导致所有消息从队列中排出,但是没有到达客户端。我在查看 this 之后添加了此 header 所以回答。
  2. 在递增 messageCount 之前,在函数中添加了 d.ack();。这会导致服务器端出现错误,因为它会在 session 关闭后(由于断开连接)尝试确认消息。

此外,在某些情况下,当我重新连接且排队消息数少于 100 时,我能够获取所有消息。但是,一旦超过 100,就没有任何反应(不确定这是否与问题有关)。

不知道是服务器端还是客户端的问题。有任何输入吗?

最佳答案

最后,我找到(并解决)了这个问题。我们使用 nginx 作为代理,并将 proxy_buffering 设置为 on (默认值),请查看文档 here .

这就是它所说的:

When buffering is enabled, nginx receives a response from the proxied server as soon as possible, saving it into the buffers set by the proxy_buffer_size and proxy_buffers directives.

因此,消息被缓冲(延迟),导致断开连接。我们尝试绕过 nginx,效果很好,然后我们禁用了代理缓冲,现在似乎工作正常,即使使用 nginx 代理也是如此。

关于java - RabbitMQ Stomp 通过 websocket : Unable to retrieve queued messages,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35566551/

相关文章:

go - 如何按名称将任务发布到 Go 中的 RabbitMQ 队列?

node.js - 使用node.js和Jade但index.jade没有显示

java - 将 xhtml 样式提取到 css?

java - Spring MVC 资源不映射

Java 支持无法弄清楚

node.js - 端口 34037 已在使用 Heroku + Nodejs + Express + WebSockets

angularjs - Socket.io + Express + Node + Angular 通知

Rabbitmq-设计消息重放服务

rabbitmq - 具有多个路由键的一次交换或在 RabbitMQ 中高效的多个交换

java - 当我读取 GPS 位置时 Android 返回 null