2017-03-17 35 views
0

我正在使用石英作业调度器来运行一些作业。使用java API我正在管理这项工作。如何使用sql手动更改石英作业计划时间?

当我用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。

Table Structure:

+0

是否有办法把你提到的表的截图?如果这与我们使用的相同,我希望看到一个示例数据。我可能会帮助你。 :) – dco

+0

@dco感谢您的帮助。从hiroyukik的评论很显然,我们不能更新石英内部表。所以我会找到其他方法来解决它。同样根据我的公司政策,我不应该在外面分享我的表格数据。 – Vino

+0

其实你可以。我们使用T-SQL更新了石英表的时间。掩盖数据并离开计划。或者创建一个虚拟表格,以便我们可以看到定义和样本数据。 – dco

回答

2

我认为你不应该用SQL直接更新石英表。在Quartz文档中没有正确的SQL方法,因此,没有人保证将来Quartz和数据库之间的接口不会有任何更改。

根据文件Lesson 9: Job Stores

从来没有在代码中直接使用JobStore实例由于某种原因 许多人试图做到这一点。 JobStore用于石英本身的幕后使用 。你必须告诉Quartz(通过配置) 要使用哪个JobStore,但是你只能在你的代码中使用 Scheduler接口。

你应该按照下面的文件来更新你的触发器。

How-To: Updating a trigger

如果你没有用户界面,您需要为某种方式更新时间表创建新的接口。

+0

这是有道理的。谢谢 – Vino

0

由经验丰富的,我们只是更新NEXT_FIRE_TIME列如下:

`UPDATE dbo.QRTZ_TRIGGERS SET NEXT_FIRE_TIME =1491004800 ` 

,其中1491004800是2017年4月00:00:00 GMT下面

使用T-SQL来获取NEXT_FIRE_TIME 1日你的愿望。您可能需要更改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表进行任何修改。