如何通过 Arangodb 中的 Queue 运行 作业

How to run a job through Queue in 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);

我收到以下错误:

Job failed: ArangoError: service not found Mount path: "/myJob".

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

回答你的问题:

您不必将作业脚本提取到新服务中。可以使用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 中删除了对旧的基于函数的作业类型的支持,并且更新了说明书配方以反映基于脚本的作业类型:https://docs.arangodb.com/2.8/cookbook/FoxxQueues.html

可以在文档中找到有关新队列的更详细说明:https://docs.arangodb.com/3.1/Manual/Foxx/Scripts.html