问题描述
我们使用的是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连接的超时。