我正在从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”。
我不确定我是否必须将我的工作扩展为外部服务。你能帮帮我吗我没有看到一个完整的例子如何做到这一点。
1条答案
按热度按时间bfnvny8b1#
回答您的问题:
您不必将作业脚本提取到新服务中。您可以使用
module.context.mount
指定当前服务的挂载点。您可以在文档中找到有关上下文对象的更多信息:https://docs.arangodb.com/3.11/develop/foxx-microservices/reference/service-context/
顺便说一下,在安装时随意创造就业机会可能不是一个好主意。队列的常见用例是在路由处理程序中创建作业,作为传入请求的副作用(例如在注册时发送欢迎电子邮件)。
如果在挂载时创建作业(例如,在你的主文件或它所需要的文件中),每当文件被执行时,作业将被创建,这将是每个Foxx线程至少一次(默认情况下,ArangoDB使用多个Foxx线程来处理并行请求),或者当开发模式被启用时,每个请求一次(!).
同样,如果您在安装脚本中创建了一个作业,那么每当执行安装脚本时,它就会被创建,尽管每次只会在一个线程中发生(但在开发模式处于活动状态时,每个请求仍然会发生一次)。
如果你需要例如一个与服务共存的周期性作业,您应该将其放在一个唯一的队列中,并且只有在检查它是否已经存在之后才能在安装脚本中创建它。
关于队列API中的更改:
队列API在2.6中发生了变化,因为旧API存在严重问题,当ArangoDB守护进程在作业被推送到队列后重新启动时,会经常导致挂起作业无法正确重新调度。
具体来说,ArangoDB 2.6引入了所谓的基于脚本(而不是基于函数)的作业类型:https://docs.arangodb.com/3.11/develop/foxx-microservices/reference/related-modules/queues/
对旧的基于函数的作业类型的支持在ArangoDB 2.7中被删除。
有关新队列的更详细描述,请参阅文档:https://docs.arangodb.com/3.11/develop/foxx-microservices/guides/scripts-and-scheduling/