3

MongoDB から JSON を提供する API エンドポイントがあります。単純に次のように:

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

このエンドポイントで Kue ジョブをトリガーし、このジョブが終了したら、何らかの形でジョブの結果 (データベース内の新しいリンク) をクライアントにプッシュしたいと考えています。 HTTPGETリクエストを開きます。

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 ジョブの結果を取得する方法がない場合は、データベースにクエリを実行して新しいドキュメントを探すことができます。ただし、クライアントに別の応答を送信する方法はまだわかりません。誰かが私を正しい方向に向けてくれることを願っています!

4

2 に答える 2

1

これに遭遇した人への1つのコメント。私は「kue」を使用するときに非常に似た懸念を抱いていました.「完了」、「失敗」、「進行状況」などのメッセージをサポートしていたにもかかわらず、結果をリクエスタにリレーできなかったことに非常に驚きました.

「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 を突っ込むのが嫌いなので、ジョブ オブジェクトに「send」メソッドを追加して、「kue」でこれをもう少し公開するプル リクエストを送信しました。

その場合、構文は少し明確になります。つまり、

    queue.process(task, function(job, done) {
      console.log("Did job: "+job.id);
      job.send("result", "Yeah baby!");
      done();
    });
于 2014-04-09T15:22:38.450 に答える
1

実際、これはドキュメントでカバーされています - https://github.com/LearnBoost/kue

「お仕事イベント

ジョブ固有のイベントは、Redis pubsub を介して Job インスタンスで発生します。現在、次のイベントがサポートされています。

  • failed仕事が失敗した
  • complete仕事が完了しました
  • promotionジョブ (遅延時) は現在キューに入れられています
  • progress0 ~ 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.writeandを使用します (自分でデータを取得する必要があります)。また、これに時間がかかりすぎると、ブラウザがタイムアウトする可能性があることに注意してください..res.endres.jsonJSON.stringify

于 2013-03-13T12:58:31.363 に答える