获取Kue作业的结果,并通过打开的连接将其推送给客户端



我有一个API端点,从MongoDB提供一些JSON。就像这样:

router.get('/api/links', function (req, res) {
  // Find existing links
  links.find({ feed: 1 }, function (err, links) {
    res.json(links)
  })
})

我希望这个端点触发一个Kue作业,当这个作业完成时,我希望以某种方式将作业的结果(数据库中的新链接)推送到客户端-类似于Twitter流API,它保持开放的HTTP GET请求。

router.get('/api/links', function (req, res) {
  // Find existing links
  links.find({ feed: 1 }, function (err, links) {
    res.json(links)
  })
  // Kue job to update the links database
  jobs.create('update subscriptions', {
    title: req.user.username,
    feeds: feeds
  }).save()
  // When the job is done, the new links in the database (the output
  // of the Kue job) should be pushed to the client
})

但是,我不确定如何获得Kue作业的结果,也不确定在作业完成时如何将新接收到的数据推送到客户端。

如果没有办法获得Kue作业的结果,我可以只查询数据库中的新文档。但是,我仍然不确定如何发送另一个响应给客户端。希望有人能给我指出正确的方向!

实际上这在文档中有介绍- https://github.com/LearnBoost/kue

"工作事件

Job-specific events通过Redis pubsub在Job实例上触发。当前支持以下事件:

  • failed作业失败
  • complete作业已完成
  • promotion作业(当延迟时)现在排队
  • progress作业进度范围0-100例如,它可能看起来像下面这样:

    var job = jobs.create('video conversion', {
        title: 'converting loki's to avi'
      , user: 1
      , frames: 200
    });
    job.on('complete', function(){
        console.log("Job complete");
    }).on('failed', function(){
        console.log("Job failed");
    }).on('progress', function(progress){
        process.stdout.write('r  job #' + job.id + ' ' + progress + '% complete');
    });
    

请记住,您的作业可能不会立即处理(取决于您的队列),因此客户端可以等待一段时间以获得结果。

编辑:正如评论中提到的,作业不返回任何结果,因此您应该将结果与作业id一起存储在数据库中,并在作业完成时查询数据库。

为了保持连接打开,使用res.writeres.end而不是结束连接的res.json(您必须自己JSON.stringify数据)。另外,请记住,如果时间过长,浏览器可能会超时。

有谁碰巧看到这个评论。我在使用"kue"时也有类似的担忧,我很惊讶地发现,尽管它支持"完成"、"失败"one_answers"进度"等消息,但它不能将结果传递回请求者。

通过挖掘'kue'源,我发现实际上很容易发送自己的自定义消息(如'结果'消息)。我所做的是这样的:

var events = require('kue/lib/queue/events');
...
    queue.process(task, function(job, done) {
      console.log("Did job: "+job.id);
      events.emit(job.id, "result", "Yeah baby!");
      done();
    });
有了这个,你可以这样做:
job.on("result", function(res) {
    console.log("Got result: "+res);
});

但是我讨厌戳到私有api,所以我提交了一个pull请求,通过向job对象添加一个'send'方法,在'kue'中更多地暴露这一点。

在这种情况下,语法更清晰一些

    queue.process(task, function(job, done) {
      console.log("Did job: "+job.id);
      job.send("result", "Yeah baby!");
      done();
    });

相关内容

  • 没有找到相关文章