我将从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扩展为外部服务。你能帮助我吗。我没有看到如何做到的完整示例。
答案 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