2014-10-11 139 views
2

我想使用Pubsub模塊進入我的應用程序,現在我正在嘗試運行一些發佈/訂閱測試,目前爲止沒有結果。XMPP Pubsub問題訂閱和發佈使用smack

在我使用ejabberd 2.1.11與發佈訂閱服務器端安裝(或至少這就是它似乎)

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> 

現在我不知道那個無效的有效負載,在互聯網上查看文檔我沒有看到什麼大的差異。

編輯

@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 2014-10-11 11:21:37

+0

嗨,謝謝你的回答,我正在使用smack 4.0.4,並且我認爲這個消息是不正確的(未正確發佈),因爲我在'error-type'節點內收到了一個'invalid-payload'。也許我錯了?,這個消息是成功發送的? – zozelfelfo 2014-10-11 11:37:25

回答

3

我認爲問題在於item只有文本,沒有包含XML元素。這是Smack的SimplePayload類的一個不幸的設計問題。基本上你想構建SimplePayload時

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

更換

"test book" 

+0

我嘗試了您的建議,但現在我收到與嘗試訂閱節點時相同的錯誤。 java.io.EOFException:沒有更多數據可用 - 預期的結束標記關閉第1行的開始標記,解析器停止在END_TAG看到... ... @ 1 :3625'任何猜測它的意思?我應該開始考慮我的服務器沒有正確配置嗎?,節點似乎被正確創建。 – zozelfelfo 2014-10-11 17:03:44

+0

日誌中必須有更多 – Flow 2014-10-11 19:58:46

+0

我已經添加了ejabberd崩潰日誌,以防萬一可以在這裏顯示一些光:) – zozelfelfo 2014-10-12 07:54:27