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

如何在arangodb后台任务中调用外部函数,arangodb,Arangodb,我有一个功能完全正常工作,我想在后台每30分钟调用一次。但它并不是将错误调用和抛出为“未定义” app.js 我试着在一个单独的js中定义hourly,然后用'require'调用它,但这无法定位模块'myjob' myjob.js 函数hourly(){require(“console”);console.log(“我正在运行”) app.js })) 命令属性的内容不能引用在其他范围中定义的变量。例如,在app.js变体中,您使用了一个名为hourly的变量,该变量在执行命令时可能不再存在

我有一个功能完全正常工作,我想在后台每30分钟调用一次。但它并不是将错误调用和抛出为“未定义”

app.js 我试着在一个单独的js中定义hourly,然后用'require'调用它,但这无法定位模块'myjob'

myjob.js 函数hourly(){require(“console”);console.log(“我正在运行”)

app.js
}))

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

在只记录一些东西的简单情况下,如果app.js变量的
命令
参数更改为以下值(不需要任何变量),则可以使其工作:

在单独的文件(名为
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
需要位于模块搜索路径中。默认情况下为
js/node
的IIRC。还请注意,此目录已包含捆绑模块,并且可能会在ArangoDB更新时更改

如果常规命令是从Foxx路由中执行的,那么使用Foxx队列也可能是一个选项,因为它们应该允许将带有作业功能的脚本放在应用程序目录中。但是,我还没有尝试过这个方法。

解决这个问题的“Foxx方法”是使用队列和基于脚本的作业(在2.6中介绍)

我已经在一篇博客文章和食谱中介绍了这一点

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


就我个人而言,我建议使用一个外部调度器并从那里调用Foxx脚本(通过Foxx manager CLI或HTTP API)。

你是说我应该在js/node中复制myjob.js?我可以这样做,但我希望我能保持它与我的应用程序完整。谢谢你详细的回答。我现在可以前进了。我实际上不确定这是不是正确的方法。我想我现在就开始悬赏,这样我们就能找到答案了。是的。作为生产系统的解决方案,我现在使用外部调度器。然而,在arangodb中,事情太快就被弃用了,这有点恼人。例如,我的大多数foxx应用程序都是基于队列机制构建的,但现在已经不推荐了(仅在2个月内)。:)@DeepakAgarwal遗憾的是,对队列系统的更改必须快速跟踪,因为最初的实现在2.5版本中被破坏,并且无法使其在新版本的ArangoDB上可靠地工作。一般来说,我们会尽量保持API的稳定性。当谈到ArangoDB中API的变化速度时,Foxx确实是个例外。
var tasks = require("org/arangodb/tasks");
tasks.register({
    period : 5,
    command : "require('console').log('I am running from inline command');"
});
function hourly() { 
  require("console").log('I am running from myjob.js');
}

exports.hourly = hourly;
var tasks = require("org/arangodb/tasks");
tasks.register({
    period : 5,
    command : "require('myjob').hourly();"
});