1

我尝试在 NodeJS 中使用带有确认的 socketCluster。

我遵循此页面中的代码: 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} 上传套接字集群服务器,但没有帮助。我如何知道是否收到消息?

4

2 回答 2

0

如果我的理解很好,你会在什么时候得到一个 ACK
await agServer.exchange.invokePublish('foo', 'This is some more data');

被执行并且当你没有进入 catch 语句时。

agServer.exchange.invokePublish()

ACK 由 SocketCluster 在后台管理,您不必管理或阅读它。我的回答有用吗?

于 2020-08-19T20:16:37.400 回答
0

回复您的最后一条评论@Lior。如果没有收到 ACK,将执行“catch”块。如何正确重试=我不知道。我不是 SocketCluster 专家,但似乎没有自动机制来处理这个问题。您可以在 try / catch 块周围放置一个“do / while”循环(通过防止无限循环):

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 && (!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);
})();

满意吗?;)

于 2020-08-26T16:06:28.843 回答