如何在arangodb中的后台任务中调用外部函数

时间:2015-06-24 16:09:06

标签: arangodb

我的功能完全正常,我希望每30分钟从后台任务调用一次。但它不会将错误称为“未定义”。

app.js

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'

myjob.js

function hourly(){require(“console”); console.log('我正在运行');

app.js

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');"
});

});

2 个答案:

答案 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)。