如何在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)。
我有一个功能完全正常,我想每 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)。