【问题标题】:ejabberd pubsub unsubscribe issueejabberd pubsub 退订问题
【发布时间】:2012-09-14 13:15:33
【问题描述】:

当我尝试从 pubsub 节点退订时遇到问题。

我正在用 js 编写一个 BOSH 客户端。

这就是我订阅的方式(使用完整的 JID):

<body rid='1023502710' xmlns='http://jabber.org/protocol/httpbind' sid='2ded0255fc6e8bf912a2871d415173faadecfea6'>
<presence xmlns='jabber:client'/>
<presence from='sav1@my.server.com/my_resource' to='amd.my.server.com/sav' xmlns='jabber:client'/>
<iq to='pubsub.my.server.com' type='set' xmlns='jabber:client' id='5007:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <subscribe node='/home/monitoring/sav' jid='sav1@my.server.com/my_resource'/>
    </pubsub>
</iq>
</body>

在我的下一个绑定请求中,我收到以下节(因为我已经订阅了节点属性):

http://xmpp.org/extensions/xep-0060.html#example-24:实体也可以通过在元素上包含“节点”属性来请求其在特定节点的所有订阅(例如,如果它有多个 SubID 的订阅)。

<body xmlns='http://jabber.org/protocol/httpbind'>
<message xmlns='jabber:client' from='pubsub.my.server.com' to='sav1@my.server.com/my_resource'>
    <event xmlns='http://jabber.org/protocol/pubsub#event'>
        <items node='/home/monitoring/sav'>
            <item id='monitor'>
                <!-- some pubsub information -->
            </item>
        </items>
    </event>
    <delay xmlns='urn:xmpp:delay' from='amd.my.server.com' stamp='2012-09-14T12:36:28Z'/>
</message>
<iq xmlns='jabber:client' from='pubsub.my.server.com' to='sav1@my.server.com/my_resource' id='5007:sendIQ' type='result'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <subscription jid='sav1@my.server.com/my_resource' subscription='subscribed' subid='543990DD8E6E6' node='/home/monitoring/sav'/>
    </pubsub>
</iq>
<message xmlns='jabber:client' from='pubsub.my.server.com' to='sav1@my.server.com/my_resource' type='headline'>
    <event xmlns='http://jabber.org/protocol/pubsub#event'>
        <items node='/home/monitoring/sav'>
            <item id='monitor'>
                <!-- some pubsub information -->
            </item>
        </items>
    </event>
    <headers xmlns='http://jabber.org/protocol/shim'>
        <header name='Collection'>/home/monitoring/sav</header>
        <header name='SubID'>5435B7F0CA392</header>
        <!-- a lot of other SubIDs -->
    </headers>
</message>
</body>

在标题部分,我收到了很多 SubID。我想这是因为退订不好。

当我结束会话时,我会取消订阅每个 SubID :

<body rid='1023502724' xmlns='http://jabber.org/protocol/httpbind' sid='2ded0255fc6e8bf912a2871d415173faadecfea6'>
<iq to='pubsub.my.server.com' type='set' xmlns='jabber:client' id='5008:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <unsubscribe node='/home/monitoring/sav' jid='sav1@my.server.com' subid='5435B7F0CA392'/>
    </pubsub>
</iq>
<!-- a lot of other unsubscribed iqs -->
</body>

答案立竿见影:

<body xmlns='http://jabber.org/protocol/httpbind'>
<iq xmlns='jabber:client' from='pubsub.my.server.com' to='sav1@my.server.com/my_resource' type='error' id='5008:sendIQ'>
    <pubsub xmlns='http://jabber.org/protocol/pubsub'>
        <unsubscribe node='/home/monitoring/sav' jid='sav1@my.server.com' subid='5435B7F0CA392'/>
    </pubsub>
    <error code='401' type='cancel'>
        <unexpected-request xmlns='urn:ietf:params:xml:ns:xmpp-stanzas'/>
        <not-subscribed xmlns='http://jabber.org/protocol/pubsub#errors'/>
    </error>
</iq>
</body>

除了我最初收到的第一个子 ID 外,没有提到其他子 ID。

我做错了什么?

我正在运行 ejabberd 2.1.10。

【问题讨论】:

    标签: xmpp publish-subscribe ejabberd


    【解决方案1】:

    我认为资源不应该与订阅的 jid 一起传递。我不知道这是否只是示例中剩下的内容,但这可能会使事情变得混乱。

    【讨论】:

    • 这就是我以前做的,所以我这样做是为了解决另一个问题(我不记得它是什么:我会问我的团队,但我想是当人们没有正确退订,出于任何原因,例如浏览器崩溃或野蛮关机)。我会再试一次,但我不知道 ejabberd 中保存了哪些信息。谢谢
    【解决方案2】:

    尝试使用与订阅相关联的完整 JID 而不是您当前使用的基本 JID 来取消订阅。

    您可以从对当前订阅请求的响应中获取 JID。 jid 属性包含与订阅关联的完整 jid。

    <iq xmlns='jabber:client' from='pubsub.my.server.com' to='sav1@my.server.com/my_resource' id='5007:sendIQ' type='result'>
        <pubsub xmlns='http://jabber.org/protocol/pubsub'>
            <subscription jid='sav1@my.server.com/my_resource' subscription='subscribed' subid='543990DD8E6E6' node='/home/monitoring/sav'/>
        </pubsub>
    </iq>
    

    【讨论】:

    • 我不知道完整的 JID,但我应该试试这个。谢谢
    • 这是对您获取订阅请求的响应。查看我的更新。
    • 好吧,我不知道在脏注销后由 ejabberd 保存的之前的完整 JID。现在,我总是使用相同的资源,所以我总是拥有相同的完整 jid。正如您在我的问题中看到的那样,ejabberd 仅返回一个订阅响应,但 THEN 会告诉我与我的裸 jid 关联的所有其他子 ID。
    猜你喜欢
    • 2016-04-09
    • 1970-01-01
    • 1970-01-01
    • 2014-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-11-05
    • 1970-01-01
    相关资源
    最近更新 更多