我的功能完全正常,我希望每30分钟从后台任务调用一次。但它不会将错误称为“未定义”。
function hourly() { require("console"); console.log('I am running');}
controller.get('/testOnce', function(req, res) {
var tasks = require("org/arangodb/tasks");
tasks.register({
id : "Test",
name : "Testing background task",
period : 5,
command : "hourly()"
});
});
我尝试在一个单独的js中定义每小时,然后用'require'调用它但是这个throws无法定位模块'myjob'
function hourly(){require(“console”); console.log('我正在运行');
controller.get('/testOnce', function(req, res) {
var tasks = require("org/arangodb/tasks");
tasks.register({
id : "Test",
name : "Testing background task",
period : 5,
command : "var job = require('myjob');"
});
});
答案 0 :(得分:5)
command
属性的内容不能引用其他范围中定义的变量。例如,在 app.js 变体中,您使用的是名为hourly
的变量,当命令执行时,该变量可能不再存在。
在只记录某些内容的简单情况下,如果 app.js 变量的command
参数更改为以下(不需要任何变量),则该变量可以正常工作:
var tasks = require("org/arangodb/tasks");
tasks.register({
period : 5,
command : "require('console').log('I am running from inline command');"
});
通过导出该模块使该功能可用,可以使在单独的文件(名为myjob.js
)中定义作业功能的变体工作:
function hourly() {
require("console").log('I am running from myjob.js');
}
exports.hourly = hourly;
这是因为require()
只会公开模块导出的内容。在上面的例子中,模块将公开一个名为hourly
的函数,现在可以从后台任务调用,如下所示:
var tasks = require("org/arangodb/tasks");
tasks.register({
period : 5,
command : "require('myjob').hourly();"
});
请注意,为了使其正常工作,文件myjob.js
需要位于模块搜索路径中。 IIRC默认为js/node
。另请注意,此目录已包含捆绑的模块,并且可能会更改ArangoDB更新。
如果要在Foxx路由中执行常规命令,那么使用Foxx队列也可能是一个选项,因为它们应该允许将带有job函数的脚本放在应用程序目录中。但是,我还没试过这个。
答案 1 :(得分:2)
解决这个问题的“Foxx方式”将使用队列和基于脚本的作业(在2.6中引入)。
我已经在the last Foxx webinar中介绍了这一点,我正在撰写博客文章和食谱秘诀。
这样做的问题是Foxx作业不能在2.6中定期。该功能计划为2.7,但2.6只是刚刚发布,你可能很快就无法使用它。
我个人建议使用外部调度程序并从那里调用Foxx脚本(通过foxx-manager CLI或HTTP API)。