NodeJS Node-apn 实现作为守护进程

Posted

技术标签:

【中文标题】NodeJS Node-apn 实现作为守护进程【英文标题】:NodeJS Node-apn implementation as daemon 【发布时间】:2012-11-02 20:42:43 【问题描述】:

我有一个 node-apn nodejs 脚本作为 AmazonWS 上的守护程序运行。守护程序运行良好,脚本保持运行并在它出现故障时返回,但我相信我在 node.js 上遇到了同步执行和退出问题。当我使用 process.exit() 释放进程时;即使所有 console.logs 输出都说他们已经发送了我的消息,但电话上永远不会收到它们。我决定删除出口,让进程在执行后“挂起”,所有消息都成功发送。这导致我使用 ASYNC 函数执行以下实现,但似乎正在发生相同的结果。任何人都可以对此提供见解吗? APN 或其他任何地方都不会引发错误。

function closeDB()
 

    connection.end(function(err) 
    if (err) 
        console.log("ERROR: " + util.inspect(err, false, 5));
        process.exit(1);
     

    console.log("APNS-PUSH: COMPLETED.");
);

setTimeout(function()process.exit();, 50);

 // End of closeDB()

function apnsError(err, notification)

console.log(err);
console.log(notification);
closeDB();
  

function async(arg, callback) 

apnsConnection.sendNotification(arg);
console.log(arg); 
setTimeout(function()  callback(1); , 100);
 

/**
* Our mysql query callback.
*/
function queryCB(err, results) 


//error in our all, report and exit
if (err) 
    console.log("ERROR: " + util.inspect(err, false, 5));
    closeDB();
 

if(results.length == 0)

    closeDB();


var notes = [];
var count = 0;

try 
    for( var i = 0; i < results.length; i++ ) 
        var myDevice = new apns.Device(results[i]['udid']);

        var note = new apns.Notification();

        note.expiry = Math.floor(Date.now() / 1000) + 3600; // Expires 1 hour from now.
        note.badge = results[i]["notification_count"];
        note.sound = "ping.aiff";
        note.alert = results[i]["message"];
        note.device = myDevice;

        connection.query('UPDATE `tbl_notifications` SET `sent`=1 WHERE `id`=' + results[i]["id"] , function(err, results) 
                if(err)
                
                    console.log("ERROR: " + util.inspect(err, false, 5));
                
            );

        notes.push(note);
    
 catch( err ) 
    console.log('error: ' + err)


console.log(notes.length);

notes.forEach(function(nNode) 
    async(nNode, function(result) 
        count++;
        if(count == notes.length) 
            closeDB();
        
    )
);         

 // End of queryCB()

【问题讨论】:

【参考方案1】:

我有同样的问题,杀死进程也杀死了打开的套接字连接并且不允许发送通知。我提出的解决方案不是一个理想的解决方案,但它也适用于您的情况。我查看了node-apn 代码,发现Connection 对象继承自EventEmitter,因此您可以像这样监视对象上的事件:

var apnsConnection = new apn.Connection(options)

apnsConnection.sendNotification(notification)

apnsConnection.on('transmitted', function()
    console.log("Transmitted")
    callback()
)

apnsConnection.on('error', function()
    console.log("Error")
    callback()
)

这是监视发送通知的套接字,所以我不知道它在确定通知何时成功传递到 Apple 的 APNS 服务器时有多准确,但它对我来说效果很好。

【讨论】:

【参考方案2】:

您看到此问题的原因是,当您使用#pushNotification 时,它会在模块内缓冲通知并处理异步发送。

监听“transmitted”是有效的,当通知被写入套接字时发出。但是,如果您的目标是在发送所有通知后关闭套接字,那么完成此操作的最简单方法是在创建连接时使用 connectionTimeout 属性。

只需将connectionTimeout 设置为大约 1000(毫秒),并假设您没有打开其他连接,那么进程将自动退出。或者您可以在timeout 事件上设置一个事件监听器,然后从那里调用process.exit()

【讨论】:

以上是关于NodeJS Node-apn 实现作为守护进程的主要内容,如果未能解决你的问题,请参考以下文章

NodeJS在windows下怎么启动守护进程

推荐nodeJS后台守护进程-forever

nodejs 守护进程运行

pm2日志记录和日志分割

PM2 简单使用,守护node进程

使用PM2守护Nodejs命令行程序