Получение n обновлений темы, где n = 1+ количество закрытой подписки на эту тему
Мой клиент JavaScript подписывается на тему. Если я отписываюсь, а затем переписываюсь, то за каждое обновление по теме я получаю два обновления, доставляемых клиенту.
На самом деле, для каждой пары подписка-отмена подписки я получаю еще одно обновление при смене темы, если есть текущая подписка.
например
- Подписываться на
topic/a
topic/a
изменения и одно обновление доставлено- Отписаться на тему / а
topic/a
изменения и обновление не доставлено- Подписываться на
topic/a
topic/a
изменения и два обновления доставлены- Отписаться на тему / а
topic/a
изменения и обновление не доставлено- Подписываться на
topic/a
topic/a
изменения и три обновления доставлены
Как я могу получить только одно уведомление за обновление?
1 ответ
Когда вы подписываетесь, клиент использует поток подписки для прослушивания различных событий. Интересующие нас события - это update
а также unsubscribe
События. Когда вы подписываетесь, вы автоматически указываете поток для прослушивания update
События.
Если вы подписываетесь более одного раза, в зависимости от того, как вы это сделали, вы можете создать несколько потоков, каждый из которых будет получать update
События.
Например, следующее открывает два потока:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
subscription2 = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
Пока следующее открывает только один поток:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');
Когда клиент отписывается от темы, все потоки этой темы больше не прослушивают update
События. Однако, если клиент снова подпишется, все потоки для темы будут прослушивать update
события снова.
Можно закрыть поток, когда вы отписываетесь, чтобы он не слушал обновления, когда вы subscribe
снова. Это достигается путем прослушивания unsubscribe
событие в потоке и вызов close() для потока из него.
Например:
subscription = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
subscription.on('unsubscribe', function(reason, topic) {
console.log('Unsubscribed from topic:' + topic);
subscription.close();
});
subscription2 = session.subscribe('test/topic').transform(String)
.on('update', function(value, topicName) {
console.log('Got update for topic: ' + topicName, value);
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');
В этом примере, когда unsubscribe
называется subscription
закрыто. когда subscribe
Впоследствии вызывается только подписка2, прослушивает обновления.
Этот код также можно выразить более кратко, используя объектные литералы:
subscription = session.subscribe('test/topic').transform(String).on({
update : function(update, topic) {
console.log('Got update for topic: ' + topic, update);
},
unsubscribe : function(reason, topic) {
console.log('Unsubscribed from : ' + topic);
subscription.close();
}
});
subscription2 = session.subscribe('test/topic').transform(String).on({
update : function(update, topic) {
console.log('Got update for topic: ' + topic, update);
}
});
session.unsubscribe('test/topic');
session.subscribe('test/topic');