解析社区节点-apn分支-发送作业挂起

问题描述

我们使用的是node-apn lib(https://github.com/parse-community/node-apn)的parse分支-由于我们的实际问题,一年前切换到了此fork-但现在又回来了。

我们正在发送约1.000.000条通知,这些通知被分隔到不同的子任务中,其中一些在致电后发送给Apple时挂起 apnProvider.send() ...我们没有得到答复/回叫。

问题经常发生在去年年底,并且整个年度运作良好-从上周末开始,问题又回来了-我们这边没有任何改变:-(从40个流程1或2中断了那里的工作。

我们实施了一种变通方法,即一种看门狗,它可以在30秒后看到挂起的进程并将其停止,但这是一个糟糕的解决方案。我想问问有人是否有想法来解决这个问题或找出真正的原因。我没有收到任何错误事件。

我们测试了不同的nodejs版本并在ubuntu服务器上工作-还测试了不同的版本。

最诚挚的问候。

代码部分:

初始化:

var options = { production: apnsproduction };
options.token = {key: apnsKey,keyId: apnsKeyId,teamId: apnsTeamId };
apnProvider = new apn.Provider(options);

观看事件:

apnProvider.on("transmissionError",function(errCode,notification,device) {
      console.log(...);
});

apnProvider.on("timeout",function () {
   console.log(...);
});

apnProvider.on("disconnected",function() {
   console.log(...);
});

apnProvider.on("socketError",function(err){
   console.log(err);
});

apnProvider.on("goaway",function(err){
   console.log(err);
});

然后我们在MysqL中有接收器,所以我进行选择并在数组中收集100个接收器并将消息发送给它们:

apnProvider.send(message,arrReciver).then( (result) => {

      result.sent.forEach( (token) => {
         transmittedCnt++;
      });

      result.Failed.forEach( (failure) => {
         errorCnt++;

         if (failure.error) // A transport-level error occurred (e.g. network problem)
         {
             console.log(...) // some log output ...
         }
         else
         {
            db.deletePushDev("ios",failure.device,"send error " + failure.status + " - " + util.inspect(failure.response));  
         }
      });

      cntSendFunctionsRunning--;
      callback();
   }).catch((result) => {
      console.log(result);
   });

callback()...确实会继续为接下来的100个设备进行选择提取...希望这很清楚-我无法在此处提供整个代码

解决方法

此问题已在解析社区的新版本4.0.0的node-apn fork中进行了处理。新版本处理了http2连接的超时。

问题:https://github.com/parse-community/node-apn/issues/24