0

AmazonWSでデーモンとして実行されているnode-apnnodejsスクリプトがあります。デーモンは正​​常に実行され、スクリプトは起動したままで、停止すると元に戻りますが、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()
4

2 に答える 2

0

プロセスを強制終了すると、開いているソケット接続も強制終了され、通知の送信が許可されないという同じ問題が発生しました。私が思いついた解決策は理想的な解決策ではありませんが、あなたの状況でも機能します。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サーバーに正常に渡された時期を判断するのにどれほど正確かはわかりませんが、私にとってはかなりうまく機能しています。

于 2013-05-30T18:28:05.750 に答える
0

この問題が発生する理由は、この問題を使用する#pushNotificationと、モジュール内の通知がバッファリングされ、非同期での送信が処理されるためです。

「送信済み」のリッスンは有効であり、これは通知がソケットに書き込まれたときに発行されます。ただし、すべての通知が送信された後にソケットを閉じることが目的である場合、これを実現する最も簡単な方法はconnectionTimeout、接続を作成するときにプロパティを使用することです。

1000(ミリ秒)前後に設定connectionTimeoutするだけで、他に開いている接続がないと仮定すると、プロセスは自動的に終了します。または、イベントにイベントリスナーを設定して、そこからtimeout呼び出すこともできprocess.exit()ます。

于 2013-06-05T14:03:19.087 に答える