Получение 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');
Другие вопросы по тегам