2

使用 nodejs 和 kue,我想将一个长时间运行的作业插入队列并忘记它。工人将处理所有细节。

简短的例子:

(function(){
  var kue = require('kue');
  var jobs = kue.createQueue();

  var job = jobs.create('email', {
    foo: "bar"
  }).save(function(err){  
    console.log("saved"); 
    jobs.shutdown( function(err){ 
       console.log("shutting down");
    },0); 
  }); 
 }());
 // DOES NOT EXIT

该作业已创建(并单独处理),但生产者进程在没有中断信号的情况下不会退出。

我不希望生产者进程保持资源或连接打开。我不想听工作事件。我希望有一种“一劳永逸”的方法。

kue会这样做吗?如何?

谢谢!

编辑:

1:添加:lsof -p 显示到端口 6379(redis 服务器)的开放 tcp 连接

2:我也尝试在关机回调中调用 job.client.quit() 。

4

1 回答 1

0

原因是因为底层的redis客户端在连接断开的时候会自动重新连接。

您可以通过在创建 kue 队列时传递一些 redis 配置选项来稍微控制一下:

kue.createQueue( {redis: { options: { max_attempts: 0 } } } );

但是,max_attempts 必须为 1 或更大。如上例所示,零值将被忽略:

https://github.com/mranney/node_redis/blob/master/index.js#L50

因此,正如所写(在 redis 客户端中),一旦打开连接,它就会保持打开状态。无论我为 max_attempts 设置了什么,或者我调用了多少次 shutdown() 或 quit(),连接始终是打开的,直到我中断程序。

于 2014-05-01T12:46:39.753 回答