Ошибка при подтверждении сообщения о толчке

Мы используем пружинный удар по веб-сокетам, поддерживаемый ActiveMQ 5.11.1. Когда клиент подтверждает сообщение, я получаю следующее исключение:

"<<< ERROR

content-type: text / plain message: неожиданный ACK получен для идентификатора сообщения [ID \ cjanus-61128-1430365808166-2 \ c1 \ c-1 \ c1 \ c1] content-length: 722

org.apache.activemq.transport.stomp.ProtocolException: получен неожиданный ACK для идентификатора сообщения [ID: janus-61128-1430365808166-2: 1: -1: 1: 1] в 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. 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'});

Я попытался установить подтверждение для индивидуального клиента, и это не помогло. Может ли кто-нибудь сказать мне, что я упускаю / делаю не так?


person myspri    schedule 30.04.2015    source источник


Ответы (1)


Какую версию STOMP (1.0, 1.1 или 1.2) использует соединение? STOMP 1.2 содержит критическое изменение:

Кадр ACK ДОЛЖЕН включать в себя заголовок id, соответствующий заголовку подтверждения сообщения MESSAGE.

Я предлагаю захватить трафик STOMP с помощью сниффера пакетов или отладчика и сравнить заголовки со спецификацией.

person mjn    schedule 01.05.2015
comment
Спасибо! Я использовал STOMP 1.1, и мне пришлось отправить идентификатор подписки и идентификатор сообщения, например, так: smepClient.ack (message_id, subscription_id); Чтобы найти это, мне пришлось покопаться в исходном коде AMQ src. - person myspri; 03.05.2015