openfire外部组件如何处理在线状态和订阅?

时间:2012-02-24 12:57:24

标签: java xmpp openfire whack

我通过扩展AbstractComponent类构建了基于Whack库的外部openfire组件。我希望客户端订阅我的组件并在组件联机和脱机时接收状态通知。所以我的问题是我们如何处理基于AbstractComponent的外部组件的存在和存在订阅?

目前我可以通过使用handlePresence()方法来响应在线请求,但是如何将客户端添加到组件名单(外部组件是否首先允许列表)?

@Override
protected void handlePresence(Presence presence){
    if (presence.getType() ==  Presence.Type.subscribe){
        System.out.println("The component has received Subscribtion request.");
        Presence original =  presence;
        Presence response = new Presence();
        //Swap the sender/recipient fields
        response.setTo(original.getFrom());
        response.setFrom(original.getTo());
        //Convert the text to upper case
        response.setType(Presence.Type.subscribed);
        send(response);

    }
}

1 个答案:

答案 0 :(得分:2)

组件没有服务器提供的名单。如果需要,您可以将自己的名册存储在数据库中。有些应用程序可以完全没有名册(当他们只想在网上向所有人展示时)。

向所有人显示在线(最简单的方法,不需要名册存储):

  • 当您收到<presence type="subscribe"/>
  • <presence type="subscribed"/>回复时
  • 当您收到<presence type="probe"/>回复时<presence/>(或您要显示的任何状态)

要存储名单需要更多工作,但允许您跟踪谁有权查看您的存在,以及您有权查看其存在。在某些情况下,如果您不想管理自己的名单,可能更喜欢在此处使用普通客户端连接。杰克莫菲特在这里写了一篇关于这个想法的博客文章:http://metajack.im/2008/08/04/thoughts-on-scalable-xmpp-bots/

请注意,在这篇文章中,我省略了节中的'to'和'from'属性。在传出的节中放置'to'和'from'是由组件决定的。所有传入的节都会有'到'和'从'。

向用户显示组件的状态

您需要处理的基本传入节是:

  • <presence type="subscribe">

    • 发件人想要订阅您的状态更新。您可以批准也可以拒绝此操作。如果您批准,则应将发件人的JID存储在数据库中,这样您就知道需要在必要时向他们发送您的状态更新。
    • 规格:http://xmpp.org/rfcs/rfc6121.html#sub-request-handle
  • <presence type="unsubscribe">

    • 发件人希望停止接收您的状态更新。您应该从订阅了您的更新的人员列表中删除它们,然后发送回<presence type="unsubscribed"><presence type="unavailable">
    • 规范:http://xmpp.org/rfcs/rfc6121.html#sub-cancel-inbound(虽然文本更多地针对服务器而不是此处的组件)。
  • <presence type="probe">
    • 发件人要求您当前的存在。只需回复该用户的最新在线状态节。这通常由用户的服务器在登录时发送。

接收组件中的用户

此外,如果您希望组件知道用户的存在,则需要向他们发送订阅请求:<presence type="subscribe">。您应该准备好接受批准(<presence type="subscribed">)或拒绝(<presence type="unsubscribed">)。

当组件首次联机时,它可以通过向每个用户发送<presence type="probe">来获取用户的当前状态。在组件运行时,每个用户不需要多次执行此操作 - 如果用户批准了上述订阅请求,则用户的服务器将自动向您发送状态更新。