2012-01-05 7 views
3

私はZappaアプリケーションで作業していますが、現在はサーバーを停止して、require.cacheをクリアして、ファイルを再起動してサーバーを再起動するスクリプトを作成しようとしています変更は、のようなもの:私はIDが一致するかどうかを確認することができますので、NodeJS HTTPServerが閉じるまでに長時間かかります

# watch all dependent files 
for file of require.cache 
    fs.watch file, -> 
    # attach a handler to 'close' 
    # -- here's the issue: this takes far too long to trigger 
    server.on 'close', -> 
     server = require './server' 
     server.start() 

     # log the new server's id 
     console.log server.id 

    # stop the current server instance 
    server.stop() 

    # clear require's cache 
    delete require.cache[f] for f of require.cache 

は、私も自分の要求ハンドラでconsole.log server.idラインを持っています。

私は依存関係を変更するとサーバーが停止し、新しいサーバーが起動し、新しいIDがすべて記録されます。しかし、その後のランダムな時間の間、サーバーへの要求は古いIDをログに記録し、古いリスナーが何らかの形でまだ接続されていることを示します。最終的に、リスナーは「切り替え」され、新しいIDが記録されます。

更新:が、これは(当然)closeイベントに関連しているようだ - 私はcloseイベントにシンプルconsole.log 'close'コールバックを添付した場合、IDは'close'表示されたら変更を開始します。ただし、イベントが発生するまでには時間がかかります(10秒以上)、なぜ時間がかかるのですか? node.js docsによると

答えて

2

新しい接続を受け付けからサーバーを停止し

server.close()

。 net.Server.close()を参照してください。

だから、あなたのサーバーは、新しい接続の受け入れを停止しますが、現在の接続がクローズされるまで、それは実際に近い(とcloseイベントを放出)しません。おそらくkeep-aliveリクエストでクライアントに接続していると思います。

0

私は同じ問題を探していました。

プロジェクトで問題がなければ、すぐにすべての接続を閉じることができます。これは完全に私のために閉鎖の問題を解決します。

app.use((req, res, next) => { 
    res.setHeader('Connection', 'close'); 
    next(); 
}); 
関連する問題