Грешна дестинация в заглавката на 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. Окончателна, libstomp е последната ревизия от svn (рев. 90 - http://svn.codehaus.org/stomp/trunk/c/), и е компилиран с apr 1.4.6; всички работят на Win-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 master, дестинацията се обработва

Вижте 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