首页 文章

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

提问于
浏览
2

我将从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 回答

  • 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

相关问题