如何为koajs服务器做优雅的停止?

时间:2017-04-18 09:30:40

标签: node.js oracle express mongoose koa

有许多关于表达优雅停止的例子,我怎样才能为koajs实现同样的目标?

我想断开数据库连接

我有一个mongoose数据库连接和2个oracle数据库连接(https://github.com/oracle/node-oracledb

2 个答案:

答案 0 :(得分:4)

我前段时间创建了一个npm包http-graceful-shutdownhttps://github.com/sebhildebrandt/http-graceful-shutdown)。这与httpexpresskoa完美配合。由于你想添加自己的清理内容,我修改了包,所以你现在可以添加自己的清理函数,这将在关闭时调用。所以基本上这个包处理所有http关闭的东西,并调用你的清理函数(如果在选项中提供):

const koa = require('koa');
const gracefulShutdown = require('http-graceful-shutdown');
const app = new koa();

...
server = app.listen(...); // app can be an express OR koa app
...

// your personal cleanup function - this one takes one second to complete
function cleanup() {
  return new Promise((resolve) => {
    console.log('... in cleanup')
    setTimeout(function() {
        console.log('... cleanup finished');
        resolve();
    }, 1000)       
  });
}

// this enables the graceful shutdown with advanced options
gracefulShutdown(server,
    {
        signals: 'SIGINT SIGTERM',
        timeout: 30000,
        development: false,
        onShutdown: cleanup,
        finally: function() {
            console.log('Server gracefulls shutted down.....')
        }
    }
);

答案 1 :(得分:1)

为确保正确关闭Oracle DB连接,可以使用连接池并以drainTime为0或更大的值来调用pool.close()。这将使该应用相对干净地中断当前正在使用连接的任何操作。它允许释放数据库的连接端,而无需DB在清理自身之前等待任何超时时间到期。即使有两个连接,这也是我要考虑的解决方案,因为池的大小无关紧要。您可能还需要设置Oracle Net带外中断检测,请参见Connections and High Availability