您好,欢迎访问一九零五行业门户网

如何在Java中使用Quartz实现定时任务?

scheduler 每次执行,都会根据jobdetail创建一个新的job实例,这样就可以规避并发访问的问题(jobdetail的实例也是新的)
quzrtz 定时任务默认都是并发执行,不会等待上一次任务执行完毕,只要间隔时间到就会执行,如果定时任务执行太长,会长时间占用资源,导致其它任务堵塞
@disallowconcurrentexecution: job类上,禁止并发地执行同一个job定义 (jobdetail定义的)的多个实例。
scheduler:可以理解为定时任务的工作容器或者说是工作场所,所有定时任务都是放在里面工作,可以开启和停止。
trigger:可以理解为是定时任务任务的工作规则配置,例如说,没个几分钟调用一次,或者说指定每天那个时间点执行。
jobdetail:定时任务的信息,例如配置定时任务的名字,群组之类的。
job:定时任务的真正的业务处理逻辑的地方。
简单示例testclient.java
import org.quartz.*;import org.quartz.impl.stdschedulerfactory;public class taskclient { public static void main(string[] args) { jobdetail jobdetail = jobbuilder.newjob(taskjob.class) .withidentity("job1", "group1") //设置job的名字和组 .build(); trigger trigger = triggerbuilder.newtrigger() .withidentity("trigger1", "trigger1") .startnow() .withschedule(simpleschedulebuilder.simpleschedule().withintervalinseconds(1) .repeatforever()) .build(); try { scheduler scheduler = stdschedulerfactory.getdefaultscheduler(); scheduler.schedulejob(jobdetail,trigger); scheduler.start(); } catch (schedulerexception ex) { ex.printstacktrace(); } }}
taskjob.java
import cn.hutool.core.date.dateutil;import org.quartz.job;import org.quartz.jobexecutioncontext;import org.quartz.jobexecutionexception;public class taskjob implements job { @override public void execute(jobexecutioncontext jobexecutioncontext) throws jobexecutionexception { system.out.println("taskjob => " + dateutil.now()); }}
usingjobdata通过 usingjobdata 往定时任务中传递参数
import org.quartz.*;import org.quartz.impl.stdschedulerfactory;public class taskclient { public static void main(string[] args) { jobdetail jobdetail = jobbuilder.newjob(taskjob.class) .withidentity("job1", "group1") .usingjobdata("job","jobdetail1.jobdatamap.value") .build(); trigger trigger = triggerbuilder.newtrigger() .withidentity("trigger1", "trigger1") .usingjobdata("trigger","trigger.jobdatamap.value") .startnow() .withschedule(simpleschedulebuilder.simpleschedule().withintervalinseconds(1) .repeatforever()) .build(); try { scheduler scheduler = stdschedulerfactory.getdefaultscheduler(); scheduler.schedulejob(jobdetail,trigger); scheduler.start(); } catch (schedulerexception ex) { ex.printstacktrace(); } }}
taskjob.java
import org.quartz.job;import org.quartz.jobdatamap;import org.quartz.jobexecutioncontext;import org.quartz.jobexecutionexception;public class taskjob implements job { @override public void execute(jobexecutioncontext context) throws jobexecutionexception { jobdatamap jobdatamap = context.getjobdetail().getjobdatamap(); jobdatamap triggermap = context.gettrigger().getjobdatamap(); jobdatamap mergemap = context.getmergedjobdatamap(); system.out.println("jobdatamap => " + jobdatamap.getstring("job")); system.out.println("triggermap => " + triggermap.getstring("trigger")); system.out.println("mergemap => " + mergemap.getstring("trigger")); }}
通过属性赋值
import org.quartz.*;import org.quartz.impl.stdschedulerfactory;public class taskclient { public static void main(string[] args) { jobdetail jobdetail = jobbuilder.newjob(taskjob.class) .withidentity("job1", "group1") .usingjobdata("job","jobdetail1.jobdatamap.value") .usingjobdata("name","jobdetail1.name.value") //通过 setname 自动赋值 .build(); trigger trigger = triggerbuilder.newtrigger() .withidentity("trigger1", "trigger1") .usingjobdata("trigger","trigger.jobdatamap.value") .usingjobdata("name","trigger.name.value") //如果 trigger 有值,会覆盖 jobdetail .startnow() .withschedule(simpleschedulebuilder.simpleschedule().withintervalinseconds(1) .repeatforever()) .build(); try { scheduler scheduler = stdschedulerfactory.getdefaultscheduler(); scheduler.schedulejob(jobdetail,trigger); scheduler.start(); } catch (schedulerexception ex) { ex.printstacktrace(); } }}
import org.quartz.*;public class taskjob implements job { private string name; public void setname(string name) { this.name = name; } @override public void execute(jobexecutioncontext context) throws jobexecutionexception { system.out.println("name => " + name); }}
非并发执行@disallowconcurrentexecution job类上,禁止并发地执行同一个job定义 (jobdetail定义的)的多个实例。
import cn.hutool.core.date.dateutil;import org.quartz.*;@disallowconcurrentexecutionpublic class taskjob implements job { @override public void execute(jobexecutioncontext context) { system.out.println("time => " + dateutil.now()); try { thread.sleep(3000); } catch (interruptedexception e) { e.printstacktrace(); } }}
@persistjobdataafterexecution
持久化jobdetail中的jobdatamap(对 trigger 中的 datamap 无效),如果一个任务不是
import cn.hutool.core.date.dateutil;import org.quartz.*;//持久化jobdetail中的jobdatamap(对 trigger 中的 datamap 无效),如果一个任务不是@persistjobdataafterexecutionpublic class taskjob implements job { @override public void execute(jobexecutioncontext context) { jobdatamap triggermap = context.getjobdetail().getjobdatamap(); triggermap.put("count", triggermap.getint("count") + 1); system.out.println("time => " + dateutil.now() + " count =>" + triggermap.getint("count")); }}
client
import org.quartz.*;import org.quartz.impl.stdschedulerfactory;public class taskclient { public static void main(string[] args) { jobdetail jobdetail = jobbuilder.newjob(taskjob.class) .withidentity("job1", "group1") .usingjobdata("job","jobdetail1.jobdatamap.value") .usingjobdata("name","jobdetail1.name.value") //通过 setname 自动赋值 .usingjobdata("count",0) //通过 setname 自动赋值 .build(); trigger trigger = triggerbuilder.newtrigger() .withidentity("trigger1", "trigger1") .usingjobdata("trigger","trigger.jobdatamap.value") .usingjobdata("name","trigger.name.value") //如果 trigger 有值,会覆盖 jobdetail .startnow() .withschedule(simpleschedulebuilder.simpleschedule().withintervalinseconds(1) .repeatforever()) .build(); try { scheduler scheduler = stdschedulerfactory.getdefaultscheduler(); scheduler.schedulejob(jobdetail,trigger); scheduler.start(); } catch (schedulerexception ex) { ex.printstacktrace(); } }}
以上就是如何在java中使用quartz实现定时任务?的详细内容。
其它类似信息

推荐信息