生活随笔
收集整理的這篇文章主要介紹了
jfinal整合quartz实现定时任务的两种方式
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
第一種實現方式
1.導入包
<dependency> ?? ??? ? ? ?<groupId>org.quartz-scheduler</groupId> ?? ??? ? ? ?<artifactId>quartz</artifactId> ?? ??? ? ? ?<version>2.3.0</version> ?? ??? ?</dependency> |
2:在myconfig中配置quartz插件:
QuartzPlugin quatrZPlugin = new QuartzPlugin();
me.add(quatrZPlugin);//定時任務插件
3.在根目錄下設置配置文件,我設置的目錄是src/main/resources
quartz_config.properties
| #配置主要調度程序屬性 org.quartz.scheduler.instanceName = DefaultQuartzScheduler org.quartz.scheduler.instanceId = AUTO org.quartz.scheduler.rmi.export = false org.quartz.scheduler.rmi.proxy = false org.quartz.scheduler.wrapJobExecutionInUserTransaction = false ?
#配置線程池 org.quartz.threadPool.threadCount = 10 org.quartz.threadPool.threadPriority = 5 ? #?配置任務 org.quartz.jobStore.misfireThreshold = 60000 org.quartz.scheduler.skipUpdateCheck = true |
?
4.在src/main/java下面編寫代碼
? ? 所需工具類有三個:FormaterCronExpression.java、QuartZKit.java、QuartzPlugin.java;需要一個實體類:JobBean.java;然后就可以編寫任務了,目錄結構如下圖:
(1),config配置類,
(2),任務實體類,
(3),任務實現類,
(4),工具類,
(5).配置文件。
JobBean.java:
| public class JobBean { ?? ?/** 任務id */ ?? ?private String jobId; ? ?? ?/** 任務描述 */ ?? ?private String jobDesc; ? ?? ?/** 任務運行時間表達式 */ ?? ?private String cronExpression; ? ?? ?/** 任務分組 */ ?? ?private String jobGroup; ? ?? ?/** 任務類 */ ?? ?private String jobClass; ? ?? ?public String getJobId() { ?? ??? ?return jobId; ?? ?} ? ?? ?public void setJobId(String jobId) { ?? ??? ?this.jobId = jobId; ?? ?} ? ?? ?public String getJobDesc() { ?? ??? ?return jobDesc; ?? ?} ? ?? ?public void setJobDesc(String jobDesc) { ?? ??? ?this.jobDesc = jobDesc; ?? ?} ? ?? ?public String getCronExpression() { ?? ??? ?return cronExpression; ?? ?} ? ?? ?public void setCronExpression(String cronExpression) { ?? ??? ?this.cronExpression = cronExpression; ?? ?} ? ?? ?public String getJobGroup() { ?? ??? ?return jobGroup; ?? ?} ? ?? ?public void setJobGroup(String jobGroup) { ?? ??? ?this.jobGroup = jobGroup; ?? ?} ? ?? ?public String getJobClass() { ?? ??? ?return jobClass; ?? ?} ? ?? ?public void setJobClass(String jobClass) { ?? ??? ?this.jobClass = jobClass; ?? ?} ? ?? ?public JobBean(String jobId, String jobDesc, String cronExpression, String jobGroup, String jobClass) { ?? ??? ?this.jobId = jobId; ?? ??? ?this.jobDesc = jobDesc; ?? ??? ?this.cronExpression = cronExpression; ?? ??? ?this.jobGroup = jobGroup; ?? ??? ?this.jobClass = jobClass; ?? ?} ? ?? ?public JobBean() { ?? ??? ?super(); ?? ?} } ? |
FormaterCronExpression.java:
| import java.text.ParseException; import java.text.SimpleDateFormat; import java.util.Date;
public class FormaterCronExpression { ?? ?static String formart = "yyyy-MM-dd HH:mm:ss"; ?? ?? ?? ?public static String formaterCronExpression(String date){ ?? ??? ?SimpleDateFormat format = new SimpleDateFormat(formart.substring(0, date.length() - 1)); ?? ??? ?SimpleDateFormat format2 = new SimpleDateFormat("yyyy MM dd HH mm ss"); ?? ??? ?try { ?? ??? ??? ?Date d = format.parse(date); ?? ??? ??? ?date = format2.format(d); ?? ??? ??? ?String[] dateArry = date.split(" "); ?? ??? ??? ?String exp = dateArry[5] + " " + dateArry[4] + " " + dateArry[3] + " " + dateArry[2] + " " + dateArry[1] ?? ??? ??? ??? ??? ?+ " ? " + dateArry[0]; ?? ??? ??? ?return exp; ?? ??? ?} catch (ParseException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?return ""; ?? ?} } ? |
QuartZKit.java:
| package com.pointlion.sys.plugin.quartz; import com.pointlion.sys.plugin.quartz.bean.JobBean; public class QuartZKit { ?? ?/*** ?? ? * 動態(tài)添加任務 ?? ? */ ?? ?public static void addTask(String taskid , String closeTime){ ?? ? ? ?JobBean job = new JobBean(); ?? ? ? ?job.setJobClass("com.pointlion.sys.plugin.quartz.task.ResetYearHoliday"); ?? ? ? ?job.setCronExpression(FormaterCronExpression.formaterCronExpression(closeTime)); ?? ? ? ?job.setJobGroup("DakeTaskJob"); ?? ? ? ?job.setJobDesc("DakeTaskJob_" + taskid); ?? ? ? ?QuartzPlugin.addJob(job); ?? ?} } ? |
QuartzPlugin.java:
| package com.pointlion.sys.plugin.quartz; import java.util.ArrayList; import java.util.List; import java.util.Map; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.Job; import org.quartz.JobBuilder; import org.quartz.JobDetail; import org.quartz.Scheduler; import org.quartz.SchedulerException; import org.quartz.SchedulerFactory; import org.quartz.TriggerBuilder; import org.quartz.TriggerKey; import org.quartz.impl.StdSchedulerFactory; import com.jfinal.kit.PropKit; import com.jfinal.kit.StrKit; import com.jfinal.plugin.IPlugin; import com.pointlion.sys.plugin.quartz.bean.JobBean; public class QuartzPlugin implements IPlugin{ ?? ?private List<JobBean> jobs = new ArrayList<JobBean>(); ?? ?private SchedulerFactory sf; ?? ?private static Scheduler scheduler; ?? ?private String jobConfig; ?? ?private String confConfig; ?? ?private Map<Object, Object> jobProp; ?? ? ?? ?public QuartzPlugin(String jobConfig, String confConfig) { ?? ??? ?this.jobConfig = jobConfig; ?? ??? ?this.confConfig = confConfig; ?? ?} ? ?? ?public QuartzPlugin(String jobConfig) { ?? ??? ?this.jobConfig = jobConfig; ?? ??? ?this.confConfig = "quartz_config.properties"; ?? ?} ? ?? ?public QuartzPlugin() { ?? ??? ?this.jobConfig = "quartz_job.properties"; ?? ??? ?this.confConfig = "quartz_config.properties"; ?? ?} ? ?? ? ? ?? ?@Override ?? ?public boolean start() { ?? ??? ?loadJobsFromProperties(); ?? ??? ?startJobs(); ?? ??? ?return true; ?? ?} ?? ? ?? ? ?? ?/*** ?? ? * 從配置文件中加載任務 ?? ? */ ?? ?private void loadJobsFromProperties() { ?? ??? ?if (StrKit.isBlank(jobConfig)) { ?? ??? ??? ?return; ?? ??? ?} ?? ??? ?jobProp = PropKit.use(jobConfig).getProperties(); ?? ??? ?String jobArray = (String) jobProp.get("jobArray"); ?? ??? ?if (StrKit.isBlank(jobArray)) { ?? ??? ??? ?return; ?? ??? ?} ?? ??? ?String[] jobArrayList = jobArray.split(","); ?? ??? ?for (String jobName : jobArrayList) { ?? ??? ??? ?jobs.add(createJobBean(jobName)); ?? ??? ?} ?? ?} ?? ? ?? ?private void startJobs() { ?? ??? ?try { ?? ??? ??? ?if (StrKit.notBlank(confConfig)) { ?? ??? ??? ??? ?sf = new StdSchedulerFactory(confConfig); ?? ??? ??? ?} else { ?? ??? ??? ??? ?sf = new StdSchedulerFactory(); ?? ??? ??? ?} ?? ??? ??? ?scheduler = sf.getScheduler(); ?? ??? ?} catch (SchedulerException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?for (JobBean entry : jobs) { ?? ??? ??? ?addJob(entry); ?? ??? ?} ?? ??? ?try { ?? ??? ??? ?scheduler.start(); ?? ??? ?} catch (SchedulerException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ?} ? ?? ?public static void addJob(JobBean job) { ?? ??? ?try { ?? ??? ??? ?TriggerKey triggerKey = TriggerKey.triggerKey(job.getJobDesc(), job.getJobGroup()); ?? ??? ??? ?CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); ?? ??? ??? ?// 不存在,創(chuàng)建一個 ?? ??? ??? ?if (null == trigger) { ?? ??? ??? ??? ?@SuppressWarnings("unchecked") ?? ??? ??? ??? ?Class<Job> j2 = (Class<Job>) Class.forName(job.getJobClass()); ?? ??? ??? ??? ?JobDetail jobDetail = JobBuilder.newJob(j2).withIdentity(job.getJobDesc(), job.getJobGroup()).build(); ?? ??? ??? ??? ?jobDetail.getJobDataMap().put("scheduleJob", job); ? ?? ??? ??? ??? ?// 表達式調度構建器 ?? ??? ??? ??? ?CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); ? ?? ??? ??? ??? ?// 按新的cronExpression表達式構建一個新的trigger ?? ??? ??? ??? ?trigger = TriggerBuilder.newTrigger().withIdentity(job.getJobDesc(), job.getJobGroup()) ?? ??? ??? ??? ??? ??? ?.withSchedule(scheduleBuilder).build(); ?? ??? ??? ??? ?try { ?? ??? ??? ??? ??? ?scheduler.scheduleJob(jobDetail, trigger); ?? ??? ??? ??? ?} catch (Exception e) { ?? ??? ??? ??? ??? ?e.printStackTrace(); ?? ??? ??? ??? ?} ?? ??? ??? ?} else { ?? ??? ??? ??? ?// Trigger已存在,那么更新相應的定時設置 ?? ??? ??? ??? ?// 表達式調度構建器 ?? ??? ??? ??? ?CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(job.getCronExpression()); ? ?? ??? ??? ??? ?// 按新的cronExpression表達式重新構建trigger ?? ??? ??? ??? ?trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); ? ?? ??? ??? ??? ?// 按新的trigger重新設置job執(zhí)行 ?? ??? ??? ??? ?scheduler.rescheduleJob(triggerKey, trigger); ?? ??? ??? ?} ?? ??? ?} catch (Exception e) { ?? ??? ?} ?? ?} ? ?? ?private JobBean createJobBean(String key) { ?? ??? ?JobBean job = new JobBean(); ?? ??? ?job.setJobClass(jobProp.get(key + ".class").toString()); ?? ??? ?job.setCronExpression(jobProp.get(key + ".cron").toString()); ?? ??? ?job.setJobGroup(jobProp.get(key+ ".group").toString()); ?? ??? ?job.setJobDesc(jobProp.get(key + ".desc").toString()); ?? ??? ?return job; ?? ?} ? ?? ?@Override ?? ?public boolean stop() { ?? ??? ?try { ?? ??? ??? ?scheduler.shutdown(); ?? ??? ?} catch (SchedulerException e) { ?? ??? ??? ?e.printStackTrace(); ?? ??? ?} ?? ??? ?return true; ?? ?} } ? |
任務示例ResetYearHoliday
| package com.pointlion.sys.plugin.quartz.task; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import com.jfinal.kit.PropKit; import com.jfinal.plugin.activerecord.Db; public class ResetYearHoliday implements Job{ ?? ?private static final Logger logger = LoggerFactory.getLogger(ResetYearHoliday.class); ? ?? ?@Override ?? ?public void execute(JobExecutionContext context) { ?? ??? ?logger.info("*****************************開始重置所有員工年假******************"); ?? ??? ?Db.update("update sys_user set year_holiday = '"+PropKit.get("yearHoliday").trim()+"' where type='1'"); ?? ??? ?logger.info("*****************************完成重置所有員工年假******************"); ?? ?} } ? |
第一種定時任務實現代碼編寫結束,啟動項目即可運行。
?
第二種實現方式
?? ? ?前兩步和第一種實現方式一致,第三步中除了需要配置quartz_config.properties,配置內容和第一種方式中相同名字的配置文件內容一致;還需要配置quartz_job.properties,配置內容如下。
quartz_job.properties
| #配置第一個定時任務 #開啟的任務列表“,”隔開 實際上為group #jobArray = CrawlDataPolicyTask jobArray =CheckTimeTask #搭客任務定時結束 #[秒] [分] [小時] [日] [月] [周] [年] CheckTimeTask.class=com.pointlion.sys.plugin.quartz.task.CheckTimeTask CheckTimeTask.group=CheckTimeTask CheckTimeTask.cron=0 0 1 * * ? CheckTimeTask.desc=\u6BCF\u5E74\u91CD\u7F6E\u5E74\u5047\u6570\u91CF ? #配置第二個定時任務 jobArray =DemoTask DemoTask.class=com.pointlion.sys.plugin.quartz.task.DemoTask DemoTask.group=DemoTask DemoTask.cron=0/10 * * * * ?? DemoTask.desc=\u6BCF\u5E74\u91CD\u7F6E\u5E74\u5047\u6570\u91CF |
第四步所需要的工具類QuartzPlugin.java和實體類JobBean.java和第一種實現方式中的一致。
第五步,編寫定時任務內容,如下:
任務實例:DemoTask:
| import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; public class DemoTask implements Job { ?? ?@Override ?? ?public void execute(JobExecutionContext arg0) throws JobExecutionException { ?? ??? ?System.out.println("##########開始定時任務##########"); ?? ??? ?System.out.println("aaaaaaaaaaaaaa"); ?? ??? ?System.out.println("##########結束定時任務##########"); ?? ? ? ? ?? ?} ?? ? } |
?第二種定時任務代碼編寫結束,啟動項目即可運行。
總結
以上是生活随笔為你收集整理的jfinal整合quartz实现定时任务的两种方式的全部內容,希望文章能夠幫你解決所遇到的問題。
如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。