1

我通过扩展 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);

    }
}
4

1 回答 1

2

组件没有服务器提供的名册。如果需要,您可以将自己的名册存储在数据库中。一些应用程序可以在根本没有名册的情况下侥幸逃脱(当他们只想在线出现在所有人面前时)。

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

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

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

请注意,在这篇文章中,我省略了节上的“to”和“from”属性。在传出的节上放置“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">给每个用户来获取用户的当前状态。在组件运行时,每个用户无需多次执行此操作 - 如果用户如上所述批准您的订阅请求,用户的服务器将自动向您发送状态更新。

于 2012-02-25T14:19:23.663 回答