Quartz怎么获取正在执行的Trigger的状态,即表QRTZ_FIRED_TRIGGERS中的状态呢?
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Quartz怎么获取正在执行的Trigger的状态,即表QRTZ_FIRED_TRIGGERS中的状态呢?相关的知识,希望对你有一定的参考价值。
直接用Scheduler.getTriggerState(TriggerKey triggerKey)得到的是不正确的。
数据库中建表。建表模版在Quartz包下docs/dbTables下,选择相应的数据库和版本即可
ORACLE的11个Table列表如下: QRTZ_JOB_LISTENERS:存储有关已配置的 JobListener 的信息 JOB_NAME JOB_GROUP JOB_LISTENER QRTZ_TRIGGER_LISTENERS。
Job 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知。这个事情留给了 Trigger。Quartz Trigger 继承了抽象的 org.quartz.Trigger 类。当前,Quartz 有三个可用的 Trigger:
Java代码
·org.quartz.SimpleTrigger
·org.quartz.CronTrigger
·org.quartz.NthIncludeDayTrigger
扩展资料:
Quartz框架的核心是调度器。调度器负责管理Quartz应用运行时环境。调度器不是靠自己做所有的工作,而是依赖框架内一些非常重要的部件。Quartz不仅仅是线程和线程管理。为确保可伸缩性,Quartz采用了基于多线程的架构。
启动时,框架初始化一套worker线程,这套线程被调度器用来执行预定的作业。这就是Quartz怎样能并发运行多个作业的原理。Quartz依赖一套松耦合的线程池管理部件来管理线程环境。
参考资料来源:百度百科-quartz
参考技术A 1.Quartz中的触发器TriggerJob 包含了要执行任务的逻辑,但是 Job 对何时该执行却一无所知。这个事情留给了 Trigger。Quartz Trigger 继承了抽象的 org.quartz.Trigger 类。当前,Quartz 有三个可用的 Trigger:
Java代码
·org.quartz.SimpleTrigger
·org.quartz.CronTrigger
·org.quartz.NthIncludeDayTrigger
2.SimpleTrigger的介绍
正如其名所示,SimpleTrigger对于设置和使用是最为简单的一种 Quartz Trigger。它是为那种需要在特定的日期/时间启动,且以一个可能的间隔时间重复执行 n 次的 Job 所设计的。
我们前面已经在一个简单的Quartz的例子里使用过了SimpleTrigger,我们通过
Java代码
Trigger trigger = TriggerUtils.makeSecondlyTrigger(10);
来获取到我们的Trigger,而得到的实际上就是SimpleTrigger类的一个实现;我们实际上
还可以对上面的代码进行小小的改造:
Java代码
Trigger trigger =
new SimpleTrigger("myTrigger",Scheduler.DEFAULT_GROUP,
new Date(),null,SimpleTrigger.REPEAT_INDEFINITELY,60000L);
对于Quartz而言,它还不能满足我们的触发情况,所以它仅仅是用于一些简单的触发情况;
3.org.quartz.CronTrigger
CronTrigger 允许设定非常复杂的触发时间表。然而有时也许不得不使用两个或多个 SimpleTrigger 来满足你的触发需求,这时候,你仅仅需要一个 CronTrigger 实例就够了。顾名思义,CronTrigger 是基于 Unix 类似于 cron 的表达式。例如,你也许有一个 Job,要它在星期一和星期五的上午 8:00-9:00 间每五分钟执行一次。假如你试图用 SimpleTrigger 来实现,你或许要为这个 Job 配置多个 Trigger。然而,你可以使用如下的表达式来产生一个遵照这个时间表触发的 Trigger;
比如:
Java代码
try
CronTrigger cTrigger = new CronTrigger("myTrigger",
Scheduler.DEFAULT_GROUP, "0 0/5 8 ? *
MON,FRI");
catch (ParseException ex)
ex.printStackTrace();
因为 CronTrigger 内建的如此强的灵活性,也与生俱来可用于创建几乎无所限制的表达式,且因为支持unix的cron表达式,则做为企业应用,我们的操作系统一般也都以unxi操作系统为主,所以掌握CronTrigger 的使用费用有必要,我们将在后面对CronTrigger 进行详细的介绍;
4.org.quartz.NthIncludedDayTrigger
org.quartz.NthIncludedDayTrigger 是 Quartz 开发团队最新加入到框架中的一个 Trigger。它设计用于在每一间隔类型的第几天执行 Job。例如,你要在每个月的 15 号执行开票的 Job,用 NthIncludedDayTrigger就再合适不过了。Quartz的 Caldendar 也可与 Trigger 关联以此把周末与节假日考虑进来,并在必要时跳开这些日期。接下来的代码片断描绘了如何创建一个 NthIncludedDayTrigger.
Java代码
NthIncludedDayTrigger trigger =
new NthIncludedDayTrigger("MyTrigger",Scheduler.DEFAULT_GROUP);
trigger.setN(15);
trigger.setIntervalType(NthIncludedDayTrigger.INTERVAL_TYPE_MONTHLY);
5.Job与Trigger的关系
大家都知道,一个作业,比较重要的三个要素就是Schduler,jobDetail,Trigger;
而Trigger对于job而言就好比一个驱动器;没有触发器来定时驱动作业,作业就无法运行;
对于Job而言,一个job可以对应多个Trigger,但对于Trigger而言,一个Trigger只能对应一个job;所以一个 Trigger 只能被指派给一个 Job;追问
你好,非常感谢你的解答。但我现在的问题是我需要拿到Trigger触发之后的状态,这个您能说说吗,谢谢!
本回答被提问者采纳 参考技术B TriggerWrapper内部类TriggerState的状态和数据库表qrtz_trigger的trigger_state相对应,但是没有找到怎么获取,发现这个状态是转换过来的,在类DefaultClusteredJobStore里evalOrphanedTrigger方法进行了转换,感觉只能根据Scheduler.getTriggerState(TriggerKey triggerKey)反转来得到自己想要的值了quartz设置新增任务默认暂停
新增一个定时任务,默认是【已运行】状态,如果想要设置为默认【暂停】状态,则需要对qrtz_paused_trigger_graps表进行操作,这个表存储暂停执行的Trigger组的信息
// 设置所有组都为暂停状态,添加以下语句
insert into
qrtz_paused_trigger_grps(sched_name, trigger_group)
values
(‘quartzscheduler‘, ‘_$_all_groups_paused_$_‘);
添加以上信息后,不管是什么组任务,都会设置为暂停状态,并在qrtz_paused_trigger_graps表中添加一条对应的信息,如果不想全部设置为暂停,只想对指定的任务组做暂停操作,就不要执行以上的sql,并且修改"TRIGGER_GROUP"的值为你指定的组即可,如:
insert into
qrtz_paused_trigger_grps(sched_name, trigger_group)
values
(‘quartzscheduler‘, ‘自定义组名称‘);
如果想要设置任务默认执行,就把这个表中对应的信息删除掉即可
以上是关于Quartz怎么获取正在执行的Trigger的状态,即表QRTZ_FIRED_TRIGGERS中的状态呢?的主要内容,如果未能解决你的问题,请参考以下文章