2012-05-30 19 views
1

我實現了對我們的node.js服務器的優雅停留。基本上是這樣的:當我關閉一個http服務器時,爲什麼我的套接字掛斷?

var shutDown = function() { 
    server.on('close', function() { 
     console.log('Server ' + process.pid + ' closed.'); 

     process.exit(); 
    }); 

    console.log('Shutting down ' + process.pid + '...'); 
    server.close(); 
} 

然而,當我關閉這樣的服務器,我得到一個Error: socket hang up錯誤在我連續請求。

我認爲server.close()會使服務器停止監聽並接受新的請求,但繼續處理所有掛起/打開的請求。但是,這應該導致Error: connect ECONNREFUSED

我在做什麼錯?

附加信息:該服務器由一個主和三個分叉的子/工組成。但是,船長沒有監聽或綁定到一個港口,只有這些孩子,並且他們如上所述被關閉。

回答

1

看着the docs,這聽起來像server.close()只停止新的連接進來,所以我敢肯定錯誤是與已經打開的連接。

也許你的shutDown()可以檢查server.connections並等到沒有更多?

var shutDown = function(){ 
    if(server.connections) return setTimeout(shutDown, 1000); 

    // Your shutDown code here 
} 

稍微難看(和少得多的可擴展性),但無需等待:因爲它們發生,你可以跟蹤聯繫,並自己關閉它們

server.on('connection', function(e){ 
    // Keep track of e.connection in a list. 
    // You'll want to remove e.connection 
    // from the list if it closes on its own 
} 

var shutDown = function(){ 
    // Close all remaining connections in the list 

    // Your shutDown code here 
} 
+0

我對你提出的實際上正是在第一塊:) 但是,當我先檢查連接數並在沒有剩下任何連接後調用'close()'時,可能需要很長時間直到沒有連接剩下爲止。 從看文檔看,我認爲在調用close()後,服務器將停止監聽,然後等待所有掛起的請求都處理完畢,然後纔會退出()。這就是我正在做的,這就是套接字掛起的地方。 我們一定誤解了一些東西。 – nekaab

+0

嗯,這很奇怪。看看會發生什麼,如果你執行console.log('Remaining connections:'+ server.connections);'在'server.close()'之前和之後,還有'console.log('Remaining connections:'+ this .connection);''在'process.exit()'之前。也許這會提供一些有用的信息。 – pieman72

相關問題