Я пытаюсь использовать модуль 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.
«проверять журнал я вижу, что мое сообщение было не так.» Вы показали нам сообщение, отправленное как показано отладчиком, поскольку вы говорите, что это «неправильно», каково ожидаемое сообщение, которое должно было быть отправлено? Какую версию Smack вы используете? – Flow
Привет, спасибо за ответ, я использую smack 4.0.4, и я думаю, что сообщение не правильно (неправильно опубликовано), поскольку я получаю 'invalid-payload' внутри узла' error-type'. Может быть, я ошибаюсь? Сообщение было отправлено успешно? – zozelfelfo