Проблемы XMPP Pubsub подписываются и публикуются с помощью smack

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

На стороне сервера я использую 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>

Received message

<iq id="BT97r-10" to="phantom_notifier@myserver/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>

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

ИЗМЕНИТЬ

После предложений @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","phantom_notifier@myserver/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.


person zozelfelfo    schedule 11.10.2014    source источник
comment
проверив журнал, я вижу, что мое сообщение было неверным. Вы показали нам сообщение, отправленное в том виде, в каком оно отображается отладчиком, поскольку вы говорите, что это неправильно, какое ожидаемое сообщение должно было быть отправлено? И какую версию Smack вы используете?   -  person Flow    schedule 11.10.2014
comment
Привет, спасибо за ответ, я использую smack 4.0.4 и думаю, что сообщение неверно (неправильно опубликовано), так как я получаю invalid-payload внутри узла error-type?. Может я ошибаюсь?, сообщение успешно отправлено?   -  person zozelfelfo    schedule 11.10.2014


Ответы (1)


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

"test book"

с участием

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

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

person Flow    schedule 11.10.2014
comment
Я попробовал ваше предложение, но теперь я получаю ту же ошибку, что и при попытке подписаться на узел. 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 Есть предположения, что это значит? Должен ли я начать думать о том, что мой сервер настроен неправильно? Узлы, похоже, созданы правильно. - person zozelfelfo; 11.10.2014
comment
Я добавил журналы сбоев ejabberd на всякий случай, если они могут пролить свет на это :) - person zozelfelfo; 12.10.2014