【问题标题】:How to change quartz job scheduled time manually using sql?如何使用 sql 手动更改石英作业计划时间?
【发布时间】:2017-03-17 06:12:00
【问题描述】:

我正在使用 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。

【问题讨论】:

  • 有没有办法截取您提到的表格?如果这与我们使用的相同,我想查看一个示例数据。我也许可以帮助你。 :)
  • @dco 感谢您的帮助。从 hiroyukik 的 cmets 很明显,我们无法更新石英内表。所以我会找到其他方法来解决这个问题。另外根据我的公司政策,我不应该在外面分享我的表格数据。
  • 其实可以。我们使用 T-SQL 更新了石英表计时。屏蔽数据并离开时间表。或者创建一个虚拟表,以便我们查看定义和示例数据。
  • @dco 你能看到问题描述吗?我已将其更新为具有表结构。这会有帮助吗?
  • 是的。您提到您手动更新了表格并且它不起作用。你是如何更新表格的?能不能说的具体点?

标签: java sql-server quartz-scheduler job-scheduling quartz


【解决方案1】:

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

根据文件Lesson 9: Job Stores

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

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

How-To: Updating a trigger

如果你没有 UI,你需要创建新的界面来更新你的日程安排。

【讨论】:

  • 这是有道理的。谢谢
【解决方案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 表上看到任何更改。

【讨论】:

    猜你喜欢
    • 2014-01-14
    • 2014-01-26
    • 2017-03-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-08
    • 1970-01-01
    • 2016-08-10
    相关资源
    最近更新 更多