0

私は ActionHero を初めて使用し、キューに何かを追加する必要があります。それが完了するまで待ってからデータを取得し、クライアントに応答する前に別のキューに入れられたアイテムに進みます。次のようになります。

  1. API クライアントが /foo にヒット
  2. foo アクションは bar アクションを呼び出して待機します...
  3. bar が終了すると、次の値を返します123abc
  4. 123abcその後、それを必要とするタスクのために再びキューに渡されます

ここで注目に値するのは、これが最適ではないことは理解していますが、これには 3 台のサーバーが関係しています。/foo が Node ActionHero サーバーにヒット123abcし、Java サーバー (認証サービスと考えてください) から送信され、Node ActionHero サーバーがこれを送信して .NET サーバーが取得します。

タスクを使用して今セットアップした方法は、Java サーバーにヒットし、Java サーバーは必要な値をログアウトします、以下のコードでは空のオブジェクトです

アクションの run():

api.actions.enqueue('MyJavaServerTask', {...}, function(error, toRun){
  console.log(arguments) // <-- returns { '0': null, '1': true }
  data.response.success = true
  api.queue.push(data, next)
})

仕事:

exports.task = {
  name: 'MyJavaServerTask',
  description: 'My Java Server Task',
  frequency: 0,
  queue: 'default',
  run: function (api, params, next) {
    var job = {
      response: {},
      connection: {id: 'none'},
      authorization: params.authorization,
      params: {
        apiVersion: '1',
        action: 'MyJavaServerTask',
        ...
      }
    }
    api.queue.push(job, function() {
      console.log(arguments) // <-- returns {}
      next()
    })
  }
}

ただし、Java サーバーでは、ここでもリクエスト表示され、リクエストは成功し、正しい JSON が返されます。そのためのログは次のようになります

15:19:22.542 [run-main-0] INFO  application - apiq read: {"id":"none","params":{"apiVersion":"1","action":"MyJavaServerTask"}}
generating tables and key
15:19:22.543 [run-main-0] INFO  application - result: {"key":"..."}

それで...keyそこからそれを取得して、次のキューに入れられたアイテムに追加するために使用するにはどうすればよいですか?

4

1 に答える 1

2

API クライアントsynchronousが Java バックエンドからの応答を期待している場合、アクション内から要求を呼び出さないのはなぜでしょうか?

exports.foo = {
  name: 'foo',
  description: 'foo',
  outputExample: {},
  inputs: {}

  run: function(api, data, next){
    var request = require('request);
    request.get('bar.com/bar', function(error, response){
       if(error){ return next(error); }
       var body = JSON.stringify(response.body);
       data.response = body;
       return next();
    });
  }

};

ノードでは、このパターンは優れています。アクションが待機している間、ノード サーバーは他のリクエストを処理できるからです。

あなたのタスクの例が別のタスクをキューに入れているかどうかはわかりませんか? とはapi.queue? いずれにせよ、タスクからアクションに値を戻す方法はありません。クライアントに POLL を実行させたい場合は、タスクに Java サーバーからの最終的な応答を redis または別の場所に保存してから、キーが存在するかどうかを確認し、存在する場合はそれを返す別のアクションを作成できます。

于 2016-08-26T22:46:56.083 に答える