我是新来的ActionHero,我有一个需要添加一些东西到队列,等待,直到完成并得到数据回来,然后继续与另一个队列项目之前响应客户端。如下所示:
- API客户端点击/foo
- foo动作调用bar动作并等待…
- 当bar完成时,它返回
123abc
的值 然后将 -
123abc
再次传递给需要它的任务的队列
值得注意的是,我知道这不是最佳的,但这涉及到3个服务器。/foo命中我的Node ActionHero服务器,123abc
来自Java服务器(认为它是一个身份验证服务),然后我的Node ActionHero服务器将发送这个被。net服务器捡起。
我现在设置它的方式是一个任务击中Java服务器Java服务器注销我需要的值但是在下面的代码中它是一个空对象
run() in ACTION:
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
从那里回来被用来追加到下一个队列项目?
如果API客户端期望从Java后端获得synchronous
响应,为什么不直接从操作中调用请求呢?
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();
});
}
};
在node中,这种模式非常好,因为当您的操作等待时,节点服务器可以服务其他请求。
我不太清楚你的任务示例是否正在排队另一个任务?api.queue
是什么?无论哪种方式,都没有办法将任务的值返回给操作。如果你想让客户端进行POLL,你可以让你的任务将Java服务器的最终响应存储在redis或其他地方,然后创建另一个操作来检查键是否存在,如果存在则返回它。