Как внешний компонент openfire может справляться с присутствием и подписками?

StackOverflow https://stackoverflow.com/questions/9431178

  •  12-11-2019
  •  | 
  •  

Вопрос

Я создал внешний компонент 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);

    }
}
Это было полезно?

Решение

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top