【问题标题】:Error while acknowledging stomp message确认踩踏消息时出错
【发布时间】:2015-07-09 15:04:53
【问题描述】:

我们在 websockets 上使用 spring stomp,由 ActiveMQ 5.11.1 支持。 当客户端确认消息时,我收到此异常:

"<<< ERROR

内容类型:文本/纯文本 消息:收到消息 ID [ID\cjanus-61128-1430365808166-2\c1\c-1\c1\c1] 的意外 ACK 内容长度:722

org.apache.activemq.transport.stomp.ProtocolException: 收到消息 ID [ID:janus-61128-1430365808166-2:1:-1:1:1] 的意外 ACK 在 org.apache.activemq.transport.stomp.ProtocolConverter.onStompAck(ProtocolConverter.java:462) 在 org.apache.activemq.transport.stomp.ProtocolConverter.onStompCommand(ProtocolConverter.java:247) 在 org.apache.activemq.transport.stomp.StompTransportFilter.onCommand(StompTransportFilter.java:75) 在 org.apache.activemq.transport.TransportSupport.doConsume(TransportSupport.java:83) 在 org.apache.activemq.transport.tcp.TcpTransport.doRun(TcpTransport.java:214) 在 org.apache.activemq.transport.tcp.TcpTransport.run(TcpTransport.java:196) 在 java.lang.Thread.run(Thread.java:744)

这是客户端代码:

  var sub_id = stompClient.subscribe('/user/guest/msg', function(greeting){              
                x = JSON.parse(greeting.body);
                var message_id = greeting.headers['message-id']
                stompClient.ack(message_id, sub_id);
             }, {ack: 'client'});

我尝试将 ack 设置为客户个人,但没有帮助。 谁能告诉我我错过了什么/做错了什么?

【问题讨论】:

    标签: spring websocket activemq stomp


    【解决方案1】:

    连接使用哪个 STOMP 版本(1.0、1.1 或 1.2)? STOMP 1.2 有一个breaking change:

    ACK 帧必须包含一个与 ack 头匹配的 id 头 MESSAGE 正在被确认。

    我建议使用数据包嗅探器或调试器捕获 STOMP 流量,并将标头与规范进行比较。

    【讨论】:

    • 谢谢!我使用 STOMP 1.1 并且必须像这样发送订阅 ID 和消息 ID: stompClient.ack(message_id, subscription_id);我不得不深入研究源 AMQ src 代码才能找到它。
    猜你喜欢
    • 2015-05-25
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    • 1970-01-01
    • 2014-01-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-13
    相关资源
    最近更新 更多