Socketclustser с подтверждением не работает

#node.js #socketcluster

#node.js #socketcluster

Вопрос:

Я пытаюсь использовать SocketCluster с подтверждением в NodeJS.

Я следую коду на этой странице:https://socketcluster.io/docs/basic-usage /

[Сервер] Публикует на канале и ожидает подтверждения

 (async () => {
  try {
    // Publish data; wait for an acknowledgement from the back end broker (if it exists).
    await agServer.exchange.invokePublish('foo', 'This is some more data');
  } catch (error) {
    // ... Handle potential error if broker does not acknowledge before timeout.
  }
})();
  

Но я не получаю подтверждения и не знаю, чего не хватает.
Я пытался загрузить сервер кластера сокетов с этой опцией {ackTimeout: 10000}, но это не помогло.
Как мне узнать, было ли получено сообщение?

Ответ №1:

Чтобы ответить на ваш последний комментарий @Lior. Блок «catch» будет выполнен, если подтверждение не было получено. Как правильно повторить попытку = я не знаю. Я не эксперт по SocketCluster, но, похоже, нет автоматического механизма для обработки этого. Вы могли бы поместить цикл «do / while» вокруг блока try / catch (предотвращая бесконечный цикл) :

 let i = 0;
let callIsSuccessful = false;
do {
  try {
    // Publish data; wait for an acknowledgement from the back end broker (if it     exists).
    await agServer.exchange.invokePublish('foo', 'This is some more data');
    callIsSuccessful = true;
  } catch (error) {
        // ... Handle potential error if broker does not acknowledge before timeout.
  }
} while (i   < MAX_RETRIES amp;amp; (!callIsSuccessful))
  

Вы также могли бы вызвать функцию, которая выполняет действие публикации, рекурсивным способом :

 callingFunction(paramData, currentRetryNumber){
    if(currentRetryNumber >= MAX_RETRIES){
        return;
    }
    try {
        // Publish data; wait for an acknowledgement from the back end broker (if it     exists).
        await agServer.exchange.invokePublish('foo', 'This is some more data');
    } catch (error) {
        callingFunction(paramData,   currentRetryNumber);
        // ... Handle potential error if broker does not acknowledge before timeout.
    }
}
(async () => {
    callingFunction(paramData, 0);
})();
  

Удовлетворяет ли это ? 😉

Комментарии:

1. Спасибо, но моя проблема в том, что я не могу попасть в блок catch. Я пытался добраться туда, отправив его автономному пользователю. Но я не получаю сообщение об ошибке.

2. Что ж, проблем нет… С помощью «invokePublish» вы публикуете на канале. Концепция pub / sub подразумевает, что производитель не знает, правильно ли получено сообщение подписчиком (ами). Что вы делаете здесь: вы правильно публикуете на канале, серверная часть SC не видит никакой подписки на ваш канал («пользователь отключен»), поэтому на канал не отправляется сообщение, затем серверная часть отвечает вам «ПОДТВЕРЖДЕНИЕ». Потому что это подтверждение от сервера, а не от 1 или N назначенных пользователей. Если вы хотите быть уверены, что пользователь получит сообщение, используйте не каналы, а сокеты

Ответ №2:


Если я правильно понимаю, вы получаете подтверждение, когда

 await agServer.exchange.invokePublish('foo', 'This is some more data');
  

выполняется и тогда, когда вы не вводите оператор catch.

 agServer.exchange.invokePublish()
  

Подтверждение выполняется под капотом SocketCluster, вам не нужно управлять им или читать его.
Полезен ли мой ответ?

Комментарии:

1. Но я хочу знать, когда сокет не был отправлен. Как я могу управлять повторным запуском