Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在arangodb中通过队列运行作业_Arangodb - Fatal编程技术网

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

如何在arangodb中通过队列运行作业,arangodb,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"

我正在从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'));
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});
const argv = module.context.argv;
var obj = argv[0];
console.log('obj:'+obj);
app.js

'use strict';
module.context.use('/one', require('./app'));
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});
const argv = module.context.argv;
var obj = argv[0];
console.log('obj:'+obj);
myJob.js

'use strict';
module.context.use('/one', require('./app'));
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});
const argv = module.context.argv;
var obj = argv[0];
console.log('obj:'+obj);
我发现以下错误:

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


我不确定我是否必须将我的工作扩展为外部服务。你能帮助我吗。我没有看到一个完整的例子来说明如何做到这一点。

要回答您的问题:

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

您可以在文档中找到有关上下文对象的更多信息:

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

如果在装载时创建作业(例如,在主文件或它所需的文件中),则每当执行文件时,都会创建作业,每个Foxx线程至少创建一次(默认情况下,ArangoDB使用多个Foxx线程来处理并行请求),或者每个请求启用一次开发模式(!)

同样,如果在安装脚本中创建作业,则每次执行安装脚本时都会创建作业,尽管每次仅在一个线程中发生(但在开发模式处于活动状态时,每个请求仍会发生一次)

例如,如果您需要与服务共存的定期作业,则应将其放入唯一队列中,并仅在检查其是否已存在后在安装脚本中创建


关于队列API中的更改:

队列API在2.6中发生了更改,原因是旧API存在严重问题,在将作业推送到队列后重新启动ArangoDB守护程序时,该问题通常会导致挂起的作业无法正确重新调度

具体而言,ArangoDB 2.6引入了所谓的基于脚本(而非基于函数)的作业类型:

ArangoDB 2.7中放弃了对旧的基于函数的作业类型的支持,并更新了食谱,以反映基于脚本的作业类型:


有关新队列的更详细说明,请参阅文档:

您需要为装载点队列创建另一个服务。。。在您的问题中,您需要创建服务“myJob”。。如果您想使用相同的服务,请使用您的foxx挂载路径“/myJob”是否意味着我需要创建另一个_db/_system/myJob/APP结构和manifest.json、index.js等?