0

我是 ActionHero 的新手,我需要在队列中添加一些内容,等到完成并取回数据,然后在响应客户端之前继续处理另一个队列中的项目。看起来像这样:

  1. API 客户端点击 /foo
  2. foo 动作调用 bar 动作并等待......
  3. 当 bar 完成时,它返回一个值123abc
  4. 123abc然后再次传递给需要它的任务的队列

值得注意的是,我知道这不是最佳的,但这涉及 3 台服务器。/foo 访问我的 Node ActionHero 服务器,123abc来自 Java 服务器(将其视为身份验证服务),然后我的 Node ActionHero 服务器将发送它以供 .NET 服务器接收。

我现在用任务设置它的方式确实命中了 Java 服务器,Java 服务器注销了我需要的值,在下面的代码中它是一个空对象

ACTION 中的 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 回答