如何在java中使用quartz

如何在java中使用quartz,第1张

在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)//删除任务

}

配置参见

http://kevin19900306.iteye.com/blog/1397744

于cronExpression表达式,这里讲解一下:

字段 允许值 允许的特殊字符

秒 0-59 , - * /

分 0-59 , - * /

小时 0-23 , - * /

日期 1-31 , - * ? / L W C

月份 1-12 或者 JAN-DEC , - * /

星期 1-7 或者 SUN-SAT , - * ? / L C #

年(可选) 留空, 1970-2099 , - * /

表达式意义

"0 0 12 * * ?" 每天中午12点触发

"0 15 10 ? * *" 每天上午10:15触发

"0 15 10 * * ?" 每天上午10:15触发

"0 15 10 * * ? *" 每天上午10:15触发

"0 15 10 * * ? 2005" 2005年的每天上午10:15触发

"0 * 14 * * ?" 在每天下午2点到下午2:59期间的每1分钟触发

"0 0/5 14 * * ?" 在每天下午2点到下午2:55期间的每5分钟触发

"0 0/5 14,18 * * ?" 在每天下午2点到2:55期间和下午6点到6:55期间的每5分钟触发

"0 0-5 14 * * ?" 在每天下午2点到下午2:05期间的每1分钟触发

"0 10,44 14 ? 3 WED" 每年三月的星期三的下午2:10和2:44触发

"0 15 10 ? * MON-FRI" 周一至周五的上午10:15触发

"0 15 10 15 * ?" 每月15日上午10:15触发

"0 15 10 L * ?" 每月最后一日的上午10:15触发

"0 15 10 ? * 6L" 每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6L 2002-2005" 2002年至2005年的每月的最后一个星期五上午10:15触发

"0 15 10 ? * 6#3" 每月的第三个星期五上午10:15触发

每天早上6点

0 6 * * *

每两个小时

0 */2 * * *

晚上11点到早上8点之间每两个小时,早上八点

0 23-7/2,8 * * *

每个月的4号和每个礼拜的礼拜一到礼拜三的早上11点

0 11 4 * 1-3

1月1日早上4点

0 4 1 1 *

1.需要的jar包

实现定时任务 需要quartz-1.5.1.jar和commons-logging-1.1.jar。

2.定义定时任务配置类

该类主要进行定时任务时间的设置和设置对应的定时任务类。

import org.quartz.CronTrigger

import org.quartz.JobDetail

import org.quartz.Scheduler

import org.quartz.impl.StdSchedulerFactory

public class Test{

/**

* 定时任务

*/

public static void cleanUpJob() {

try {

JobDetail jobDetail = new JobDetail()

jobDetail.setName("cleanup")

jobDetail.setJobClass(PrintJob.class)

CronTrigger trigger = new CronTrigger()

trigger.setName("cleanupTrigger")

trigger.setJobName("cleanup")

trigger.setCronExpression("0/5 * * * * ?")

Scheduler sch = StdSchedulerFactory.getDefaultScheduler()

sch.scheduleJob(jobDetail, trigger)

sch.start()

} catch (Exception e) {

e.printStackTrace()

}

}

/**

* 修改定时任务时间

*/

public static void modifyJobTime(String triggerName, String time) {

System.out.println("modify~~~~~~~~~~~~~~~~")

try {

Scheduler sched = StdSchedulerFactory.getDefaultScheduler()

System.out.println("triggerName " + triggerName)

CronTrigger trigger = (CronTrigger) sched.getTrigger(triggerName, Scheduler.DEFAULT_GROUP)

if(trigger == null) {

return

}

String oldTime = trigger.getCronExpression()

System.out.println("oldTime " + oldTime)

if (!oldTime.equalsIgnoreCase(time)) {

System.out.println("time " + time)

// 修改时间

trigger.setCronExpression(time)

}

} catch (Exception e) {

e.printStackTrace()

throw new RuntimeException(e)

}

}

public static void main(String[] args) {

cleanUpJob()

modifyJobTime("cleanupTrigger", "0/2 * * * * ?")

}

}

3.定时任务类

该类主要定义定时任务执行的内容。

import java.text.SimpleDateFormat

import java.util.Date

import org.quartz.Job

import org.quartz.JobExecutionContext

import org.quartz.JobExecutionException

public class PrintJob implements Job{

@Override

public void execute(JobExecutionContext arg0) throws JobExecutionException {

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss.SSS")

String time = sdf.format(new Date())

System.out.println("print job" + time)

}

}

4.输出结果

modify~~~~~~~~~~~~~~~~

triggerName cleanupTrigger

oldTime 0/5 * * * * ?

time 0/2 * * * * ?

print job2014-12-03 17:06:40.031

print job2014-12-03 17:06:42.015

print job2014-12-03 17:06:44.016

print job2014-12-03 17:06:46.019

print job2014-12-03 17:06:48.019

print job2014-12-03 17:06:50.020

从输出的结果中可以看到,原本的定时任务为每5秒执行一次,但是由于后面对定时任务表达式做了修改,所以后来安照修改后的每2秒执行一次。


欢迎分享,转载请注明来源:内存溢出

原文地址: http://www.outofmemory.cn/bake/11770863.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-18
下一篇 2023-05-18

发表评论

登录后才能评论

评论列表(0条)

保存