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

Python013

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

可以使用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()

List<String>myCollection = (List<String>) dataMap.get("myCollection")

// do something with myCollection

}

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

/** *//**

* 添加一个定时任务,使用默认的任务组名,触发器名,触发器组名

* @param jobName 任务名

* @param job 任务

* @param time时间设置,参考quartz说明文档

* @throws SchedulerException

* @throws ParseException

*/

public static void addJob(String jobName,Job job,String time)

throws SchedulerException, ParseException{

Scheduler sched = sf.getScheduler()

JobDetail jobDetail = new JobDetail(jobName, JOB_GROUP_NAME, job.getClass())//任务名,任务组,任务执行类

//触发器

CronTrigger trigger =

new CronTrigger(jobName, TRIGGER_GROUP_NAME)//触发器名,触发器组

trigger.setCronExpression(time)//触发器时间设定

sched.scheduleJob(jobDetail,trigger)

//启动

if(!sched.isShutdown())

sched.start()

}

/** *//**

* 添加一个定时任务

* @param jobName 任务名

* @param jobGroupName 任务组名

* @param triggerName 触发器名

* @param triggerGroupName 触发器组名

* @param job 任务

* @param time时间设置,参考quartz说明文档

* @throws SchedulerException

* @throws ParseException

*/

public static void addJob(String jobName,String jobGroupName,

String triggerName,String triggerGroupName,

Job job,String time)

throws SchedulerException, ParseException{

Scheduler sched = sf.getScheduler()

JobDetail jobDetail = new JobDetail(jobName, jobGroupName, job.getClass())//任务名,任务组,任务执行类

//触发器

CronTrigger trigger =

new CronTrigger(triggerName, triggerGroupName)//触发器名,触发器组

trigger.setCronExpression(time)//触发器时间设定

sched.scheduleJob(jobDetail,trigger)

if(!sched.isShutdown())

sched.start()

}

/** *//**

* 修改一个任务的触发时间(使用默认的任务组名,触发器名,触发器组名)

* @param jobName

* @param time

* @throws SchedulerException

* @throws ParseException

*/

public static void modifyJobTime(String jobName,String time)

throws SchedulerException, ParseException{

Scheduler sched = sf.getScheduler()

Trigger trigger = sched.getTrigger(jobName,TRIGGER_GROUP_NAME)

if(trigger != null){

CronTrigger ct = (CronTrigger)trigger

ct.setCronExpression(time)

sched.resumeTrigger(jobName,TRIGGER_GROUP_NAME)

}

}

/** *//**

* 修改一个任务的触发时间

* @param triggerName

* @param triggerGroupName

* @param time

* @throws SchedulerException

* @throws ParseException

*/

public static void modifyJobTime(String triggerName,String triggerGroupName,

String time)

throws SchedulerException, ParseException{

Scheduler sched = sf.getScheduler()

Trigger trigger = sched.getTrigger(triggerName,triggerGroupName)

if(trigger != null){

CronTrigger ct = (CronTrigger)trigger

//修改时间

ct.setCronExpression(time)

//重启触发器

sched.resumeTrigger(triggerName,triggerGroupName)

}

}

/** *//**

* 移除一个任务(使用默认的任务组名,触发器名,触发器组名)

* @param jobName

* @throws SchedulerException

*/

public static void removeJob(String jobName)

throws SchedulerException{

Scheduler sched = sf.getScheduler()

sched.pauseTrigger(jobName,TRIGGER_GROUP_NAME)//停止触发器

sched.unscheduleJob(jobName,TRIGGER_GROUP_NAME)//移除触发器

sched.deleteJob(jobName,JOB_GROUP_NAME)//删除任务

}

/** *//**

* 移除一个任务

* @param jobName

* @param jobGroupName

* @param triggerName

* @param triggerGroupName

* @throws SchedulerException

*/

public static void removeJob(String jobName,String jobGroupName,

String triggerName,String triggerGroupName)

throws SchedulerException{

Scheduler sched = sf.getScheduler()

sched.pauseTrigger(triggerName,triggerGroupName)//停止触发器

sched.unscheduleJob(triggerName,triggerGroupName)//移除触发器

sched.deleteJob(jobName,jobGroupName)//删除任务

}