如何通过arangodb中的队列运行作业

时间:2017-01-10 05:25:38

标签: arangodb

我将从ArangoDb 2.5.7转移到ArangoDb 3.1.7。除了乔布斯之外,我已经成功地完成了所有工作。我看一下文档,我不明白如果我必须为此创建一个单独的服务?

所以,我有一个foxx应用程序myApp

的manifest.json

{
"name": "myApp",
"version": "0.0.1",
"author": "Deepak",
"files": 
{
    "/static": "static"
},

"engines": 
{
    "arangodb": "^3.1.7"
},

"scripts": 
{
    "setup": "./scripts/setup.js",
    "myJob": "./scripts/myJob.js"
},

"main": "index.js"

}

index.js

'use strict';
module.context.use('/one', require('./app'));

app.js

const createRouter = require('org/arangodb/foxx/router');
const controller = createRouter();
module.exports = controller;

const queues = require('@arangodb/foxx/queues');
queue = queues.create('myQueue', 2);
queue.push({mount:"/myJob", name:"myJob"}, {"a":4}, {"allowUnknown": true});

myJob.js

const argv = module.context.argv;
var obj = argv[0];
console.log('obj:'+obj);

我收到以下错误:

  

工作失败:   ArangoError:找不到服务   装载路径:“/ myJob”。

我不确定是否必须将myJob扩展为外部服务。你能帮助我吗。我没有看到如何做到的完整示例。

1 个答案:

答案 0 :(得分:2)

回答你的问题:

您不必将作业脚本解压缩到新服务中。您可以使用module.context.mount指定当前服务的安装点。

您可以在文档中找到有关上下文对象的更多信息:https://docs.arangodb.com/3.1/Manual/Foxx/Context.html

顺便说一句,在挂载时任意创建作业可能不是一个好主意。队列的常见用例是在路由处理程序中创建作业,作为传入请求的副作用(例如,在注册时发送欢迎电子邮件)。

如果您在安装时创建作业(例如,在主文件或其所需的文件中),则只要文件执行,就会创建作业,对于每个Foxx线程至少一次(默认为ArangoDB)使用多个Foxx线程来处理并行请求)或每个请求启用一次开发模式(!)。

同样,如果您在设置脚本中创建一个作业,它将在执行安装脚本时创建,尽管这只会在每次一个线程中发生(但在开发模式处于活动状态时每个请求仍然会发生一次)。

如果您需要,例如与您的服务一起生成的定期作业,您应该将其放在一个唯一的队列中,并且只有在检查它是否已存在之后才能在您的设置脚本中创建它。

关于队列API中的更改:

由于旧API的严重问题,队列API在2.6中发生了变化,在将作业推送到队列后重新启动ArangoDB守护程序时,这会导致挂起的作业无法正确重新调度。

特别是ArangoDB 2.6引入了所谓的基于脚本(而不是基于功能)的作业类型:https://docs.arangodb.com/3.1/Manual/ReleaseNotes/UpgradingChanges26.html#foxx-queues

在ArangoDB 2.7中删除了对旧的基于功能的作业类型的支持,并更新了cookbook配方以反映基于脚本的作业类型:https://docs.arangodb.com/2.8/cookbook/FoxxQueues.html

有关新队列的更详细说明,请参阅文档:https://docs.arangodb.com/3.1/Manual/Foxx/Scripts.html