我们使用的是node的解析分支--apn lib ( https://github.com/parse-community/node-apn )--一年前我们切换到这个分支是因为我们的实际问题--但现在它又回来了。
我们发送了大约1.000.000个通知,分别分配到不同的子任务,其中一些通知在调用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);
});回调() ...是否继续对接下来的100个设备执行选择获取...希望这是足够清楚的-我不能在这里提供全部代码。
发布于 2020-10-26 20:08:19
这个问题现在在解析社区的node-apn fork的新版本4.0.0中得到了处理。新版本处理http2连接的超时。
https://stackoverflow.com/questions/64023486
复制相似问题