0

我正在使用 Quartz 作业调度程序来运行一些作业。使用 java api 我正在管理这项工作。

当我使用 java 将工作重新安排到不同的时间时,

   scheduler.deleteJob(jobName, jobGroupName);

   addJobsInScheduler(jobName, jobGroupName, triggerName,
                           triggerGroup, newTime, schoolName);

该作业正在重新安排并在指定时间触发。

现在有一个要求,我必须在没有 UI(没有 Java api)的情况下重新安排工作。

据我了解,当我重新安排工作时,下表条目会更新。

QRTZ_JOB_DETAILS

QRTZ_TRIGGERS

QRTZ_CRON_TRIGGERS

所以我手动更新了 QRTZ_TRIGGERS,QRTZ_CRON_TRIGGERS 中的触发时间。但是在更新的时间不会触发作业。

这有可能达到我的要求吗?

注意:我的后端使用的是 sql server 2008。

表结构:

4

2 回答 2

2

我相信你不应该直接用 SQL 更新 Quartz 表。Quartz 文档中没有使用 SQL 的正确方法,因此,没有人保证将来 Quartz 与数据库之间的接口不会有任何变化。

根据文档第 9 课:作业存储

切勿在代码中直接使用 JobStore 实例。出于某种原因,许多人试图这样做。JobStore 用于 Quartz 本身的幕后使用。你必须告诉 Quartz(通过配置)使用哪个 JobStore,但是你应该只在代码中使用 Scheduler 接口。

您应该按照以下文档更新您的触发器。

操作方法:更新触发器

如果您没有 UI,则需要创建新界面以以某种方式更新您的日程安排。

于 2017-03-20T08:31:44.143 回答
2

根据经验,我们只需像这样更新 NEXT_FIRE_TIME 列:

`UPDATE dbo.QRTZ_TRIGGERS SET NEXT_FIRE_TIME =1491004800 `

其中 1491004800 是 2017 年 4 月 1 日 00:00:00 GMT

使用下面的 T-SQL 获得您想要的 NEXT_FIRE_TIME。您可能需要更改 GETUTCDATE()。

SELECT DATEDIFF(s, '1970-01-01 00:00:00', GETUTCDATE())

然后更新 QRTZ_CRON_TRIGGERS 表

UPDATE dbo.QRTZ_CRON_TRIGGERS set CRON_EXPRESSION='00 10 11 ? * *'

'00 10 11 在哪里?* *' 每天上午 11:10 运行。您可以从CronMaker获取 cron 表达式

这可能不是最佳实践,但根据经验,它对我们有用,没有问题。我强烈建议先在您的较低环境中测试它。等待作业触发,看看您是否在 QRTZ_TRIGGERS 表上看到任何更改。

于 2017-03-26T06:35:56.450 回答