Неверный пункт назначения в заголовке STOMP при разговоре с сервером hornetq

Я пытаюсь настроить клиент C для общения с сервером hornetq jms. Я использую его акцептор STOMP с libstomp на стороне C.

Мой клиентский код C — это всего лишь этот пример со страницы libstomp дословно с измененными парольной фразой и именем очереди назначения (на действительную очередь, к которой можно получить доступ из java-клиента).

Вот что я получаю, когда запускаю его:

Connecting......OK
Sending connect message.OK
Reading Response.Response: CONNECTED,
OK
Sending Subscribe.OK
Sending Message.OK
Reading Response.Response: ERROR, org.hornetq.core.protocol.stomp.StompException:     Client must set destination or id head
er to a SUBSCRIBE command
        at     org.hornetq.core.protocol.stomp.StompProtocolManager.onSubscribe(StompProtocolManager.java:    339)
        at     org.hornetq.core.protocol.stomp.StompProtocolManager.handleBuffer(StompProtocolManager.java:196)
        at     org.hornetq.core.protocol.stomp.StompConnection.bufferReceived(StompConnection.java:279)
        at     org.hornetq.core.remoting.server.impl.RemotingServiceImpl$DelegatingBufferHandler.bufferRec    eived(RemotingServ
iceImpl.java:512)
        at     org.hornetq.core.remoting.impl.netty.HornetQChannelHandler.messageReceived(HornetQChannelHa    ndler.java:73)
        at     org.jboss.netty.channel.SimpleChannelHandler.handleUpstream(SimpleChannelHandler.java:100)
        at     org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:372)
        at     org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:367)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:274)
        at org.jboss.netty.channel.Channels.fireMessageReceived(Channels.java:261)
        at org.jboss.netty.channel.socket.oio.OioWorker.run(OioWorker.java:100)
        at     org.jboss.netty.util.ThreadRenamingRunnable.run(ThreadRenamingRunnable.java:108)
        at     org.jboss.netty.util.internal.DeadLockProofWorker$1.run(DeadLockProofWorker.java:44)
        at     org.jboss.netty.util.VirtualExecutorService$ChildExecutorRunnable.run(VirtualExecutorServic    e.java:181)
        at     java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
        at     java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
        at java.lang.Thread.run(Thread.java:662)
OK
Sending Disconnect.OK
Disconnecting...OK

Короче говоря, я получаю это исключение от сервера:

ERROR, org.hornetq.core.protocol.stomp.StompException: Client must set destination or id header to a SUBSCRIBE command

В строке 92 примера мы устанавливаем пункт назначения:

apr_hash_set(frame.headers, "destination", APR_HASH_KEY_STRING, "/queue/FOO.BAR");

Несмотря на это, когда сообщение попадает на сервер и он парсит заголовки, я получаю карту ation -> /queue/FOO.BAR, но она ищет ключ destination. Я подтвердил, что клиент добавляет правильную запись карты в заголовки, и она не повреждена на всем пути до отправки в сеть.

Любые указатели на то, что может быть не так?

P.S. hornetq — 2.2.9.Final, libstomp — последняя версия svn (rev 90 — http://svn.codehaus.org/stomp/trunk/c/), и он был скомпилирован с помощью apr 1.4.6; все работает на вин 7


person mtsvetkov    schedule 20.12.2012    source источник
comment
Небольшая поправка - проблема возникает как при подписке (строка 82), так и при отправке сообщения.   -  person mtsvetkov    schedule 20.12.2012


Ответы (1)


2.2.9 — довольно старый релиз HornetQ. Вы должны повторить попытку с 2.2.14 или с последней версией 2.3.beta. Я только что посмотрел код в git для мастера HornetQ, пункт назначения обрабатывается

См. onSubscribe() по адресу https://github.com/hornetq/hornetq/blob/master/hornetq-server/src/main/java/org/hornetq/core/protocol/stomp/VersionedStompFrameHandler.java#L254< /а>

FWIW, в HornetQ точка . используется как делитель для пунктов назначения (ваш код использует косую черту /). Протокол STOMP оставляет это как соглашение, зависящее от реализации.

person Francisco    schedule 08.01.2013
comment
К сожалению, я не могу контролировать, какая версия используется — 1. это было для стажерского проекта и 2. мы начали с немного более старой, хотя и стабильной версии приложения, в котором работает встроенный HornetQ. Более новые версии, вероятно, также будут работать с новым HornetQ. Я попробовал это с ., но это тоже не сработало - та же проблема. В любом случае - это было не так уж важно, поэтому я оставлю все как есть, надеясь, что обновленный HornetQ может это исправить. - person mtsvetkov; 09.01.2013