openfire 外部组件如何处理存在和订阅?
题
我通过扩展 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);
}
}
解决方案
组件没有服务器提供的名册。如果需要,您可以将自己的名册存储在数据库中。有些应用程序可以在没有名册的情况下逃脱(当他们只想向所有人显示在线时)。
在线向所有人展示(最简单的方法,无需名册存储):
- 当您收到
<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”。所有传入的节都会有“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">
给每个用户。在组件运行时,每个用户无需多次执行此操作 - 如果用户如上所述批准了您的订阅请求,则用户的服务器将自动向您发送状态更新。