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

How to call external function in background tasks in arangodb

我有一个功能完全正常,我想每 30 分钟从后台任务中调用一次。但它不会像 'undefined'.

那样调用和抛出错误

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' 调用它但是这个抛出无法定位模块 'myjob'

myjob.js

function hourly() { require("console"); console.log('I am running');

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

});

command 属性的内容不能引用在其他范围内定义的变量。例如,在 app.js 变体中,您使用了一个名为 hourly 的变量,该变量在执行命令时可能不再存在。

在只记录一些东西的简单情况下,如果将 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 队列也可能是一种选择,因为它们应该允许将带有作业函数的脚本放入应用程序目录中。但是,我还没有尝试过这个。

解决此问题的 "Foxx way" 将使用队列和基于脚本的作业(在 2.6 中引入)。

我在 the last Foxx webinar 中对此进行了介绍,并且正在撰写博客 post 和食谱。

这样做的问题是 Foxx 作业在 2.6 中不能周期性。该功能计划在 2.7 中使用,但 2.6 才刚刚发布,您可能很快就无法使用它了。

我个人建议使用外部调度程序并从那里调用 Foxx 脚本(通过 foxx-manager CLI 或 HTTP API)。