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