2014-10-11 4 views
2

Я пытаюсь использовать модуль Pubsub в своем приложении, и прямо сейчас я пытаюсь запустить некоторый тест публикации/подписки, без результата до сих пор.XMPP Проблемы с Pubsub подписываются и публикуются с использованием smack

В стороне сервера я использую ejabberd 2.1.11 с PubSub установлен (или, по крайней мере, это то, что кажется)

mod_pubsub_odbc:  [{access_createnode, pubsub_createnode}, 
{pep_sendlast_offline, false}, 
{last_item_cache, false}, 
{plugins, ["flat", "hometree", "pep"]}] 

В стороне клиента я смог создать узлы, но я не являюсь способный подписаться на них. Вот мой код

XMPPConnection mycon = new XMPPTCPConnection(connectionConfiguration); 

mycon.connect(); 
mycon.login("phantom_notifier", "phantom_notifier"); 

PubSubManager mgr = new PubSubManager(mycon); 
LeafNode leaf = mgr.getNode("testNode2"); 

leaf.addItemEventListener(new ItemEventListener() 
{ 
    @Override 
    public void handlePublishedItems(ItemPublishEvent items) { 
     //TODO 
    } 
}); 
leaf.subscribe(mycon.getUser()); 

После выполнения этого кода я всегда получаю следующее исключение

java.io.EOFException: no more data available - expected end tag </stream:stream> to close start tag <stream:stream> from line 1, parser stopped on END_TAG seen ...</x></query></iq>... @1:3734 
at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3035) 
at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046) 
at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144) 
at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093) 
at org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:279) 
at org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47) 
at org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81) 

org.jivesoftware.smack.SmackException$NoResponseException 
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:191) 
at org.jivesoftware.smack.PacketCollector.nextResultOrThrow(PacketCollector.java:175) 
at org.jivesoftware.smackx.pubsub.PubSubManager.sendPubsubPacket(PubSubManager.java:303) 
at org.jivesoftware.smackx.pubsub.Node.sendPubsubPacket(Node.java:443) 
at org.jivesoftware.smackx.pubsub.Node.subscribe(Node.java:248) 
at main.DBChangesReceiver.main(DBChangesReceiver.java:115) 

Независимо от того, к какому узлу я подписываюсь ...

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

leaf.publish(new PayloadItem<SimplePayload>("test" + System.currentTimeMillis(), 
new SimplePayload("book", "pubsub:test:book", 
"test book"))); 

В отладчике мое последнее послали и получил сообщение следующего:

отправленного сообщения

<iq id="BT97r-10" to="pubsub.myserver" type="set"> 
<pubsub xmlns="http://jabber.org/protocol/pubsub"> 
    <publish node="testNode2"> 
    <item id="test1413022577642">test book</item> 
    </publish> 
</pubsub> 

Получено сообщение

<iq id="BT97r-10" to="[email protected]/Smack" from="pubsub.myserver" type="error"> 
<pubsub xmlns="http://jabber.org/protocol/pubsub"> 
    <publish xmlns="http://jabber.org/protocol/pubsub"> 
    <item>test book</item> 
    </publish> 
</pubsub> 
<error type="modify"> 
    <bad-request xmlns="urn:ietf:params:xml:ns:xmpp-stanzas"/> 
    <invalid-payload xmlns="http://jabber.org/protocol/pubsub#errors"/> 
    </error> 
</iq> 

Прямо сейчас у меня нет никакой информации об этой недействительной полезной нагрузке, наклеивая документацию в Интернете. Я не вижу больших различий.

EDIT

После @Flow предложений пакет посланный на сервер является следующее:

<iq id="XIaTx-11" to="pubsub.myserver" type="set"> 
<pubsub xmlns="http://jabber.org/protocol/pubsub"> 
    <publish node="testNode2"> 
    <item id="test1413099855673"> 
    <book xmlns="pubsub:test:book">text book</book> 
    </item> 
    </publish> 
</pubsub> 
</iq> 

Сервер, не посылает ответ, как кажется, есть некоторая критическая ошибка (то же самое прокомментировал, когда я пытаюсь подписаться):

oct 12, 2014 9:44:15 AM org.jivesoftware.smack.XMPPConnection callConnectionClosedOnErrorListener 
Connection closed with error 
java.io.EOFException: no more data available - expected end tag </stream:stream> to close start tag <stream:stream> from line 1, parser stopped on END_TAG seen ...</x></query></iq>... @1:3625 
at org.xmlpull.mxp1.MXParser.fillBuf(MXParser.java:3035) 
at org.xmlpull.mxp1.MXParser.more(MXParser.java:3046) 
at org.xmlpull.mxp1.MXParser.nextImpl(MXParser.java:1144) 
at org.xmlpull.mxp1.MXParser.next(MXParser.java:1093) 
at org.jivesoftware.smack.tcp.PacketReader.parsePackets(PacketReader.java:279) 
at org.jivesoftware.smack.tcp.PacketReader.access$000(PacketReader.java:47) 
at org.jivesoftware.smack.tcp.PacketReader$1.run(PacketReader.java:81) 

а вот у меня есть журнал ошибок ejabberd (надеюсь, что это полезно)

=ERROR REPORT==== 2014-10-12 09:45:38 === 
** State machine <0.4880.3> terminating 
** Last message in was {route, 
        {jid,[],"pubsub.myserver",[],[], 
        "pubsub.myserver",[]}, 
        {jid,"phantom_notifier","myserver","Smack", 
        "phantom_notifier","myserver","Smack"}, 
        {xmlelement,"iq", 
        [{"type","error"}, 
         {"from","pubsub.myserver"}, 
         {"id","XIaTx-11"}], 
        [{xmlelement,"pubsub", 
         [{"xmlns","http://jabber.org/protocol/pubsub"}], 
         [{xmlelement,"publish", 
         [{"node","testNode2"}], 
         [{xmlelement,"item", 
          [{"id","test1413099855673"}], 
          [{xmlelement,"book", 
          [{"xmlns","pubsub:test:book"}], 
          [{xmlcdata,<<"text book">>}]}]}]}]}, 
         {aborted,no_transaction}]}} 


** When State == session_established 
**  Data == {state, 
       {socket_state,gen_tcp,#Port<0.218148>,<0.4879.3>}, 
       ejabberd_socket,#Ref<0.0.12.23022>,false,"2115632325", 
       {sasl_state,"jabber","myserver",[], 
        #Fun<ejabberd_c2s.1.30334249>, 
        #Fun<ejabberd_c2s.2.32721014>, 
        #Fun<ejabberd_c2s.3.7052687>,cyrsasl_digest, 
        {state,5,"3654209317","phantom_notifier",[], 
         #Fun<ejabberd_c2s.1.30334249>, 
         #Fun<ejabberd_c2s.3.7052687>, 
         ejabberd_auth_internal,"myserver"}}, 
       c2s,c2s_shaper,false,true,false,false, 
       [verify_none,{certfile,"/etc/ejabberd/ejabberd.pem"}], 
       true, 
       {jid,"phantom_notifier","myserver","Smack", 
        "phantom_notifier","myserver","Smack"}, 
       "phantom_notifier","myserver5","Smack", 
       {{1413,99937,977476},<0.4880.3>}, 
       {pres_t,1}, 
       {pres_f,1}, 
       {pres_a,1}, 
       {pres_i,0}, 
       {xmlelement,"presence", 
        [{"id","XIaTx-9"}], 
        [{xmlelement,"status",[], 
          [{xmlcdata,<<"Phantom on the phone">>}]}, 
         {xmlelement,"priority",[],[{xmlcdata,<<"42">>}]}]}, 
       undefined, 
       {{2014,10,12},{7,45,37}}, 
       false, 
       {userlist,none,[],false}, 
       c2s,ejabberd_auth_internal, 
       {{84,125,131,61},56127}, 
       []} 
** Reason for termination = 
** {{badxml, 
    {xmlelement,"iq", 
     [{"from","pubsub.myserver"}, 
     {"to","[email protected]/Smack"}, 
     {"type","error"}, 
     {"id","XIaTx-11"}], 
     [{xmlelement,"pubsub", 
      [{"xmlns","http://jabber.org/protocol/pubsub"}], 
      [{xmlelement,"publish", 
        [{"node","testNode2"}], 
        [{xmlelement,"item", 
         [{"id","test1413099855673"}], 
         [{xmlelement,"book", 
          [{"xmlns","pubsub:test:book"}], 
          [{xmlcdata,<<"text book">>}]}]}]}]}, 
     {aborted,no_transaction}]}, 
    {{case_clause,{aborted,no_transaction}}, 
    [{xml,element_to_string_nocatch,1}, 
     {xml,'-element_to_string_nocatch/1-lc$^0/1-0-',1}, 
     {xml,'-element_to_string_nocatch/1-lc$^0/1-0-',1}, 
     {xml,element_to_string_nocatch,1}, 
     {xml,element_to_string,1}, 
     {xml,element_to_binary,1}, 
     {ejabberd_c2s,send_element,2}, 
     {ejabberd_c2s,handle_info,3}]}}, 
[{xml,element_to_string,1}, 
{xml,element_to_binary,1}, 
{ejabberd_c2s,send_element,2}, 
{ejabberd_c2s,handle_info,3}, 
{p1_fsm,handle_msg,10}, 
{proc_lib,init_p_do_apply,3}]} 

Ошибка, которую мы видим, связана с той, что указана в клиенте, плохим конструированным элементом xml.

+0

«проверять журнал я вижу, что мое сообщение было не так.» Вы показали нам сообщение, отправленное как показано отладчиком, поскольку вы говорите, что это «неправильно», каково ожидаемое сообщение, которое должно было быть отправлено? Какую версию Smack вы используете? – Flow

+0

Привет, спасибо за ответ, я использую smack 4.0.4, и я думаю, что сообщение не правильно (неправильно опубликовано), поскольку я получаю 'invalid-payload' внутри узла' error-type'. Может быть, я ошибаюсь? Сообщение было отправлено успешно? – zozelfelfo

ответ

3

Я считаю, что проблема заключается в том, что item имеет только текст и не содержит XML-элемент. Это неудачная проблема дизайна с классом Smack's SimplePayload.В основном вы хотите заменить

"test book" 

с

"<book xmlns='pubsub:test:book'>text book</book>" 

при построении SimplePayload

+0

Я попробовал ваше предложение, но теперь я получаю ту же ошибку, что и при попытке подписаться на узел. 'java.io.EOFException: больше нет данных - ожидаемый конечный тег, чтобы закрыть начальный тег <поток: поток> из строки 1, синтаксический анализатор остановлен на END_TAG замечен ... ... @ 1 : 3625' Любое догадка, что это значит ?. Должен ли я начинать думать о том, что мой сервер настроен неправильно, узлы, похоже, созданы правильно. – zozelfelfo

+0

Должно быть больше в журналах – Flow

+0

Я добавил журналы аварии ejabberd, на всякий случай, может ли это пролить свет в этом :) – zozelfelfo