java任务调度quartz(java任务调度框架)

http://www.itjxue.com  2023-02-17 18:59  来源:未知  点击次数: 

java如何利用第三方Quartz实现定时任务

给你一个简单的案例加详细注解

/*

* job是一个接口,只有一个方法void execute(JobExecutionContext context),

* 被调度的作业(类)需实现该接口中execute()方法,

* JobExecutionContext类提供了调度上下文的各种信息。每次执行该Job均重新创建一个Job实例

*/

public class MyJob? implements Job {

//MyJob类为需要定时执行的类,execute为定时执行的方法。一个定时任务对应一个Job实现类。

@Override

public void execute(JobExecutionContext arg0) throws JobExecutionException {

// TODO Auto-generated method stub

perform();

}

public void perform(){ //执行报表统计入口函数

//业务逻辑

System.out.println("执行时间:"+new Date());

}

}

public class QuartzTest5 {

public static void main(String[] args) throws Exception {

//SchedulerFactory 是一个接口,用于Scheduler的创建和管理

SchedulerFactory factory = new StdSchedulerFactory();

//从工厂里面拿到一个scheduler实例

//计划表(可能翻译的不太贴切),现在我们有了要做的内容,

//与调度程序交互的主要API

/*

* Scheduler的生命期,从SchedulerFactory创建它时开始,

到Scheduler调用shutdown()方法时结束;Scheduler被创建后,

可以增加、删除和列举Job和Trigger,以及执行其它与调度相关的操作

(如暂停Trigger)。但是,Scheduler只有在调用start()方法后,

才会真正地触发trigger(即执行job)

*/

Scheduler scheduler = factory.getScheduler();

//具体任务.

//用于定义作业的实例

//JobBuilder - 用于定义/构建JobDetail实例,用于定义作业的实例。

JobDetail job = JobBuilder.newJob(MyJob.class).withIdentity("job1", "group1").build();

//Trigger(即触发器) - 定义执行给定作业的计划的组件

//TriggerBuilder - 用于定义/构建触发器实例

CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity("trigger1", "group1")

.withSchedule(CronScheduleBuilder.cronSchedule("0/1? * * * * ?")).build();

scheduler.scheduleJob(job, trigger);

scheduler.start();

}

}

java quartz 调度间隔问题

首先提出一个问题,0秒执行计时器,到40秒还没执行完,40后执行完是执行2次(20秒,40秒)还是不执行,等到60秒的时候执行。

如果是等到60秒执行的,给你的方案用一个static的boolean值来判断是否正在执行,是则跳出执行。

如果是要依次执行2次的,可以弄一个queue队列,计时器只管往queue里写队列,在弄一个线程while(true)死循环去读queue队列,如果queue内有值,则取出这个值来执行,如果没有值就等待有值执行

quartz作业调度的应用和原理

Quartz是一款由java写成的作业调度框架,在大量javase/javaee应用中被用来做定时任务,它功能强大而又不失使用简单性。

Quartz的原理不是很复杂,只要搞明白几个概念,然后知道如何去启动和关闭一个调度程序即可。

1、Job

表示一个工作,要执行的具体内容。此接口中只有一个方法

void execute(JobExecutionContext context)

线程运行Job时会把JobDataMap封装到JobExecutionContext里作为execute方法的参数,jobdetail是对job的封装,里面有Job的class,对应的数据, 名称,分组等

2、JobDetail

JobDetail表示一个具体的可执行的调度程序,Job是这个可执行程调度程序所要执行的内容,另外JobDetail还包含了这个任务调度的方案和策略。

3、Trigger代表一个调度参数的配置,job下次什么时候执行存放在trigger中。

4、Scheduler代表一个调度容器,一个调度容器中可以注册多个JobDetail和Trigger。当Trigger与JobDetail组合,就可以被Scheduler容器调度了。

5、QuartzSchedulerResources相当于调度的资源存放器,包含了JobStore, ThreadPool等资源,调度都是通过QuartzSchedulerResources获取相关属性的。

6、jobStore是任务和触发器存储地方,它里面提供大量类似于增删改的操作任务方法。

5、QuartzSchedulerThread是一个调度线程,ThreadPool是一个执行线程池,下图是运行后的线程栈:

Quartz是通过对用户暴露出Scheduler来进行任务的操作,它可以把任务JobDetail和触发器Trigger加入任务池中,可以把任务删除,也可以把任务停止,scheduler把这些任务和触发器放到一个JobStore中,这里jobStore有内存形式的也有持久化形式的,当然也可以自定义扩展成独立的服务。

它内部会通过一个调度线程QuartzSchedulerThread不断到JobStore中找出下次需要执行的任务,并把这些任务封装放到一个线程池ThreadPool中运行,它的组件结构如下图:

各类的调用关系如下图:

下面看看quartz的简单实现:

首先是一个调度管理类:

接下来实现job接口:

测试主函数如下:

运行结果如下:

java怎么使用quartz任务调度传一些集合数组

可以使用JobDataMap来传递集合数组,JobDataMap是Quartz提供的一个Map,可以用来存储任务相关的数据。

在调度任务时,可以使用JobDataMap来传递集合数组:

JobDetail jobDetail = newJob(MyJob.class)

.withIdentity("myJob", "group1")

.usingJobData("myCollection", myCollection)

.build();

// 在任务中获取集合数组

@Override

public void execute(JobExecutionContext context) throws JobExecutionException {

JobDataMap dataMap = context.getJobDetail().getJobDataMap();

ListString myCollection = (ListString) dataMap.get("myCollection");

// do something with myCollection

}

(责任编辑:IT教学网)

更多

推荐word文章