openfire 外部组件如何处理存在和订阅?
Posted
技术标签:
【中文标题】openfire 外部组件如何处理存在和订阅?【英文标题】:How openfire external component can deal with presence and subscriptions? 【发布时间】:2012-02-24 12:57:23 【问题描述】:我通过扩展 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】:组件没有服务器提供的名册。如果需要,您可以将自己的名册存储在数据库中。一些应用程序可以在根本没有名册的情况下侥幸成功(当他们只想在线向所有人展示时)。
向所有人在线显示(最简单的方法,无需存储名册):
当您收到<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">
<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">
来获取用户的当前状态。在组件运行时,每个用户无需多次执行此操作 - 如果用户如上所述批准您的订阅请求,用户的服务器将自动向您发送状态更新。
【讨论】:
如果服务器不存储组件名册,订阅范围是什么?服务端重启后会持续还是组件连接重启呢?以上是关于openfire 外部组件如何处理存在和订阅?的主要内容,如果未能解决你的问题,请参考以下文章