Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/356.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java openfire外部组件如何处理状态和订阅?_Java_Xmpp_Openfire_Whack - Fatal编程技术网

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

Java openfire外部组件如何处理状态和订阅?,java,xmpp,openfire,whack,Java,Xmpp,Openfire,Whack,我通过扩展AbstractComponent类,基于Whack库构建了一个外部openfire组件。我希望客户端订阅我的组件,并在组件联机和脱机时接收状态通知。所以我的问题是,我们如何处理基于AbstractComponent的外部组件的状态和状态订阅 目前,我可以使用handlePresence()方法响应状态请求,但是如何将客户端添加到组件花名册中(外部组件首先允许花名册吗) 组件没有服务器提供的花名册。如果需要,您可以将自己的花名册存储在数据库中。有些应用程序根本不需要花名册(当他们只是想

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

目前,我可以使用handlePresence()方法响应状态请求,但是如何将客户端添加到组件花名册中(外部组件首先允许花名册吗)


组件没有服务器提供的花名册。如果需要,您可以将自己的花名册存储在数据库中。有些应用程序根本不需要花名册(当他们只是想让每个人在线时)

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

  • 当您收到
    回复
  • 当您收到
    回复
    (或您希望显示的任何状态)
存储花名册需要更多的工作,但允许您跟踪谁有权查看您的状态,以及您有权查看谁的状态。在某些情况下,如果您不想管理自己的花名册,您可能更愿意在这里使用普通的客户端连接。杰克·莫菲特(Jack Moffitt)在这里就这个想法写了一篇博文:

请注意,在这篇文章中,我省略了节中的“to”和“from”属性。这取决于组件在传出节上放置“to”和“from”。所有传入的节都有“到”和“从”

向用户显示组件的状态

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

    • 发件人希望订阅您的状态更新。您可以批准或拒绝此操作。如果您批准,您应该将发件人的JID存储在您的数据库中,以便您知道需要在必要时向他们发送状态更新
    • 规格:
    • 发件人希望停止接收您的状态更新。您应该将他们从订阅更新的人员列表中删除,然后发回
    • 规范:(尽管本文更多地针对服务器而不是组件进行定制)
    • 发件人要求您当前在场。只需回复该用户的最新状态节。这通常由用户登录时的服务器发送
接收组件中存在的用户

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


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

如果服务器未存储组件的花名册,订阅的范围是什么?服务器重新启动后,它会继续存在吗?或者组件连接重新启动后会怎样?
@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);

    }
}