我们已经在 Node.js 服务器中使用议程一段时间了,并且对议程中的作业锁定机制如何工作感到困惑。
如果我重新启动 node.js 服务器,所有锁定的作业都会被解锁并正确执行。
为什么需要这种锁定机制?它有什么作用 ?
我正在使用节点议程模块启动用户创建的各种作业/事件。我希望能够创建Jobs,以便通过一个函数回调来处理所有Job,并根据事件参数区分每个Event。下面的示例代码
var mongoConnectionString = "mongodb://127.0.0.1/agenda";
var Agenda = require('agenda');
var agenda = new Agenda({db: {address: mongoConnectionString}});
agenda.define('user defined event', function(job,done) {
var eventParams = job.attrs.data;
if(eventParams.params === "Test"){
handleEvent1();
} else if (eventParams.params === "Test 2") {
handleEvent2();
} else {
handleEvent3();
}
done();
});
agenda.on('ready', function() {
console.log("Ok Lets get start");
agenda.start();
});
// some how we get our call back executed. Note that params is the unique to each job.
var userEvent = function(params) {
// Handle a …
Run Code Online (Sandbox Code Playgroud) 我想全屏打开 Emacs,垂直拆分两个窗口。我希望我的 todo.org 文件在左侧打开,而我的议程视图在右侧打开。
类似的问题出现在本网站的其他几个问题中,但它们并不完全相同和/或我无法使用/理解他们的答案来完全解决我的挑战。
我已经非常接近我的 custom-init.el 文件中的以下内容:
;; Windows layout setup
(add-to-list 'default-frame-alist '(fullscreen . maximized))
(split-window-right)
(setq initial-buffer-choice "~/emacs/Org/todo.org")
(setq org-agenda-window-setup 'current-window)
(add-hook 'after-init-hook (lambda () (org-agenda nil "u")))
(add-hook 'after-init-hook (lambda () (org-agenda-list 1)))
Run Code Online (Sandbox Code Playgroud)
这会正确格式化屏幕,并按照我的需要显示窗口位置和大小。它还会打开我的待办事项文件并根据需要将其放在左侧,但我在右侧打开了暂存缓冲区。议程已正确创建和格式化,并且是缓冲区列表中的第三项(scratch、todo.org、议程,然后是我在启动时打开的所有其他组织文件。)
如此接近,但经过几天的思考和尝试不同的事情,我只是没有到达那里。
我agenda.js
在我的 Node 项目中使用它,由 MongoDB 数据库支持,来处理我们需要运行的批处理过程。这运作良好。不过,我确实有一个关于时区的问题。当我使用该every()
操作时,它似乎接受作业名称和时间表。所以我一直在数据库中播种作业,如下所示:
for (let job of dbJobs) {
await agenda.every(schedule, job.name);
}
Run Code Online (Sandbox Code Playgroud)
请注意,上面的内容schedule
采用 cron 格式 - 00 05 * * 1-5
。
这有效。然而,据我所知,every()
不接受 的争论repeatTimezone
。那么在这些情况下它是如何计算时区的呢?
澄清一下,当我使用 添加作业后查看数据库中的文档时every()
,该repeatTimezone
属性存在,但其值设置为null
。
其他agenda
操作(例如repeatEvery()
)确实接受时区参数,如下所示:
job.repeatEvery('0 6 * * *', {
timezone: 'America/New_York'
});
Run Code Online (Sandbox Code Playgroud)
自从我使用 以来every()
,我一直通过首先使用 播种数据库every()
,然后运行 MongoupdateMany()
将 timzeone 显式添加到所有作业来管理此操作:
async function addTimezoneToJobs() {
try {
const …
Run Code Online (Sandbox Code Playgroud)