Как внешний компонент openfire может справляться с присутствием и подписками? - PullRequest
1 голос
/ 24 февраля 2012

Я создал внешний компонент openfire на основе библиотеки Whack, расширив класс AbstractComponent.Я хочу, чтобы клиенты подписывались на мой компонент и получали уведомления о присутствии, когда компонент подключается к сети и отключается.Поэтому мой вопрос заключается в том, как мы можем работать с подписками о присутствии и присутствии для внешнего компонента на основе 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 Ответ

2 голосов
/ 25 февраля 2012

Компоненты не имеют реестра, предоставленного сервером.Вы можете хранить свой собственный список в базе данных, если вам нужно.Некоторые приложения могут вообще обходиться без списка (когда они просто хотят появляться в сети для всех).

Чтобы отображаться в сети для всех (простейший подход, хранение в реестре не требуется):

  • Когда вы получаете <presence type="subscribe"/> ответ с <presence type="subscribed"/>
  • Когда вы получаете <presence type="probe"/> ответ с <presence/> (или любым другим статусом, который вы хотите видеть как)

Для хранения реестра требуется немного больше работы, но он позволяет вам отслеживать, кому разрешено видеть ваше присутствие, и чье присутствие вы имеете право видеть.В некоторых случаях вы можете предпочесть использовать обычное клиентское соединение, если вы не хотите управлять собственным списком.Джек Моффитт написал пост в блоге об этой идее здесь: http://metajack.im/2008/08/04/thoughts-on-scalable-xmpp-bots/

Обратите внимание, что в этом посте я опускаю атрибуты «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"> накаждый пользователь.Нет необходимости делать это более одного раза на пользователя во время работы компонента - сервер пользователя автоматически отправит вам обновления присутствия, если пользователь одобрит ваш запрос на подписку, как указано выше.

...