TriggerListener和JobListener https://nkcoder.github.io/2014/08/17/quartz-tutorial-07-listener/ 这里有详细说明加入监听
JobListener、Triggerlistener、SchedulerListener介绍与使用 http://blog.csdn.net/evankaka/article/details/45498363
可以对matcher和key下的类进行静态导入,这样使得matcher的定义更加清晰:
1 2 3 4 5 6 7 |
import static org.quartz.JobKey.*; import static org.quartz.impl.matchers.KeyMatcher.*; import static org.quartz.impl.matchers.GroupMatcher.*; import static org.quartz.impl.matchers.AndMatcher.*; import static org.quartz.impl.matchers.OrMatcher.*; import static org.quartz.impl.matchers.EverythingMatcher.*; ...etc. |
静态导入后,上面的实例可以写成:
1 2 |
scheduler.getListenerManager().addJobListener(myJobListener, allJobs()); scheduler.getListenerManager().addTriggerListener(myTriggerListener, allJobs()); |
代码开始
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
<!-- 自动调用配置 --> <bean id="taskSaveWageBarService" class="com.pandy.free.service.TaskSaveWageBarService"></bean> <bean id="jobTaskSaveWageBarServiceTrigger" class="org.springframework.scheduling.quartz.CronTriggerFactoryBean"> <property name="name" value="work_TaskSaveWageBarService"/> <property name="group" value="work_default"/> <property name="jobDetail"> <bean class="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean"> <property name="name" value="job_TaskSaveWageBarService"/> <property name="group" value="job_work"/> <!--false表示等上一个任务执行完后再开启新的任务--> <property name="concurrent" value="false"/> <property name="targetObject"> <ref bean="taskSaveWageBarService"/> </property> <property name="targetMethod"> <value>run</value> </property> </bean> </property> <property name="cronExpression"> <value>1 */1 * * * ?</value> </property> </bean> <!-- 任务调度 --> <bean id="startQuertz" lazy-init="false" autowire="no" class="org.springframework.scheduling.quartz.SchedulerFactoryBean"> <property name="triggers"> <list> <ref bean="jobTaskSaveWageBarServiceTrigger"/> </list> </property> </bean> <!-- 管理类,实现对任务的增加等 --> <bean id="quartzManager" class="com.pandy.pm.manager.QuartzManager" init-method="init"></bean> |
被自动调用的实现类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 |
package com.pandy.free.service;/** * Created by pandy on 17-7-31. */ import cn.com.voge.actor.manager.UserManager; import cn.com.voge.system.service.AbcSystemTaskService; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import javax.annotation.Resource; import java.text.SimpleDateFormat; /** * 项目名称: idea * 功能说明: 工资条数据产生,变相提高SummaryByConstructorGridImpl等类的查询速度 * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 17-7-31. * 创建时间: 上午9:52. * 修改历史: * ----------------------------------------------- */ public class TaskSaveWageBarService extends AbcSystemTaskService { private SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss"); @Resource(name = "userManager") private UserManager userManager; /** * 日志对象 */ private static final Logger LOG = LoggerFactory.getLogger(TaskSaveWageBarService.class); public void run() { try { if (isDoSystemTask()) { } } catch (Exception e) { //e.printStackTrace(); LOG.error("可以忽视的错误:" + e.getMessage()); } } } |
手动调用的实现
自定义的任务接口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
package com.pandy.pm.manager; import java.util.Map; /** * 项目名称: wp_idea_linux * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-12-4. * 创建时间: 上午9:04. * 修改历史: * ----------------------------------------------- */ public interface IQuartzJobExecute { void execute(Map<String, Object> params); } |
任务接口的实现
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
package com.pandy.pm.manager; import cn.com.voge.utils.JSONUtils; import cn.com.voge.utils.SpringUtils; import com.pandy.pm.domain.ScheduleJob; import org.apache.commons.lang.StringUtils; import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** * 项目名称: wp_idea_linux * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-12-3. * 创建时间: 下午4:22. * 修改历史: * ----------------------------------------------- */ @DisallowConcurrentExecution public class QuartzJobFactoryImpl implements Job { private static Logger logger= LoggerFactory.getLogger(QuartzJobFactoryImpl.class); @Override public void execute(JobExecutionContext context) throws JobExecutionException { ScheduleJob scheduleJob = (ScheduleJob) context.getMergedJobDataMap().get("scheduleJob"); if (StringUtils.isNotBlank(scheduleJob.getClassName())) { try { IQuartzJobExecute execute = (IQuartzJobExecute) SpringUtils.getBean(scheduleJob.getClassName()); execute.execute(JSONUtils.str2map(scheduleJob.getJsonParams())); } catch (Exception e) { e.printStackTrace(); } } else { logger.info("没有任务实现类[" + scheduleJob.getJobName() + "]★★★★★★★★★★★"); } } } |
任务定义:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 |
package com.pandy.pm.domain; /** * 项目名称: wp_idea_linux * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-12-3. * 创建时间: 下午4:23. * 修改历史: * ----------------------------------------------- */ /** * 计划任务信息 * <p/> * User: liyd * Date: 14-1-3 * Time: 上午10:24 */ public class ScheduleJob { private long jobId; private String jobName; private String jobGroup = "default"; private String jobStatus; private String cronExpression; private String className; private String jsonParams; private String descript; private String type; private boolean onTime=false; protected long instanceId; ...... } |
任务管理类:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
package com.pandy.pm.manager; import cn.com.voge.utils.SpringUtils; import com.pandy.pm.domain.IQuartzJobComp; import com.pandy.pm.domain.ScheduleJob; import org.quartz.*; import org.quartz.impl.matchers.GroupMatcher; import java.util.Date; import java.util.List; import java.util.Set; /** * 项目名称: wp_idea_linux * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-12-3. * 创建时间: 下午5:01. * 修改历史: * ----------------------------------------------- */ public class QuartzManager { public boolean validateCronExpression(String cronExpression) { try { CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); } catch (Exception e) { return false; } return true; } public boolean isDoing(final ScheduleJob scheduleJob, IQuartzJobComp comp) { try { Scheduler scheduler = (Scheduler) SpringUtils.getBean("startQuertz"); GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup(); Set<JobKey> jobKeys = scheduler.getJobKeys(matcher); for (JobKey jobKey : jobKeys) { JobDetail jobDetail = scheduler.getJobDetail(jobKey); JobDataMap dataMap = jobDetail.getJobDataMap(); ScheduleJob currScheduleJob = (ScheduleJob) dataMap.get("scheduleJob"); if (comp.comp(scheduleJob, currScheduleJob)) return true; } } catch (Exception e) { e.printStackTrace(); } return false; } public boolean isDoing(final ScheduleJob scheduleJob) { try { Scheduler scheduler = (Scheduler) SpringUtils.getBean("startQuertz"); GroupMatcher<JobKey> matcher = GroupMatcher.anyJobGroup(); Set<JobKey> jobKeys = scheduler.getJobKeys(matcher); for (JobKey jobKey : jobKeys) { List<? extends Trigger> triggers = scheduler.getTriggersOfJob(jobKey); for (Trigger trigger : triggers) { ScheduleJob job = new ScheduleJob(); job.setJobName(jobKey.getName()); job.setJobGroup(jobKey.getGroup()); if (scheduleJob.getJobName().equalsIgnoreCase(jobKey.getName()) && scheduleJob.getJobGroup().equalsIgnoreCase(jobKey.getGroup())) { return true; } } } } catch (Exception e) { e.printStackTrace(); } return false; } /** * 增加任务任务 */ public void insertJob(final ScheduleJob scheduleJob) throws Exception { try { Scheduler scheduler = (Scheduler) SpringUtils.getBean("startQuertz"); final TriggerKey triggerKey = TriggerKey.triggerKey(scheduleJob.getJobName(), scheduleJob.getJobGroup()); CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); //注意,这里使用的是自定义的job实现QuartzJobFactoryImpl,代码后面有 JobDetail jobDetail = JobBuilder.newJob(QuartzJobFactoryImpl.class).withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).build(); jobDetail.getJobDataMap().put("scheduleJob", scheduleJob); if (null == trigger) { if (!scheduleJob.isOnTime()) { if (!validateCronExpression(scheduleJob.getCronExpression())) { throw new RuntimeException("表达式错误"); } CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(scheduleJob.getCronExpression()); trigger = TriggerBuilder.newTrigger().withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()).withSchedule(scheduleBuilder).build(); scheduler.scheduleJob(jobDetail, trigger); } else { SimpleTrigger simpleTrigger = TriggerBuilder.newTrigger() .withIdentity(scheduleJob.getJobName(), scheduleJob.getJobGroup()) .startAt(new Date()) .withSchedule( SimpleScheduleBuilder.simpleSchedule() .withIntervalInSeconds(3) .withRepeatCount(0)) .build(); scheduler.scheduleJob(jobDetail, simpleTrigger); } } } catch (Exception e) { e.printStackTrace(); } } public void init() { } } |
一个被手动调用及时执行的任务:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package com.pandy.pm.manager; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.util.Date; import java.util.List; import java.util.Map; /** * 项目名称: wp_idea_linux * 功能说明: * 创建者: Pandy, * 邮箱: panyongzheng@163.com, 1453261799@qq.com * 版权: * 官网: * 创建日期: 15-12-30. * 创建时间: 下午4:25. * 修改历史: * ----------------------------------------------- */ @SuppressWarnings({"unchecked"}) public class AftUpdateFormulaProcessManager implements IQuartzJobExecute { private static Logger logger = LoggerFactory.getLogger(AftUpdateFormulaProcessManager.class); public void update(Map<String, Object> params) { Date d1=new Date(); System.out.println("★★★★★★★★★★★====>修改规则任务<====★★★★★★★★★★★"); } } |
手动调用:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
public void runFormulaProce(Integer proUserId,Integer instanceId, Integer formulaId) { try { Map<String, Object> params = com.google.common.collect.Maps.newHashMap(); ScheduleJob scheduleJob = new ScheduleJob(); UUID uuid = java.util.UUID.randomUUID(); String nameString = uuid.toString(); params.put("instanceId", instanceId); params.put("proUserId", proUserId); params.put("formulaId", formulaId); // params.putAll(param); scheduleJob.setJsonParams(JSONUtils.map2str(params)); scheduleJob.setJobName("run_formula_" + nameString); scheduleJob.setOnTime(true); scheduleJob.setClassName("aftUpdateFormulaProcessManager"); if (!quartzManager.isDoing(scheduleJob)) { notifyRemindManager.insertNotify( instanceId, proUserId, proUserId, "AUTO_FORMULA_TASK", -1, "规则后台任务", "执行规则后台任务开始"); taskSystemNotifyService.sendToOneUser(proUserId, instanceId); quartzManager.insertJob(scheduleJob); // context.addMessage("后台任务开始执行,需要耗时一定的时间."); // context.setSuccess(true); } else { // context.addMessage("后台任务开始执行已经正在运行,不要重复执行."); // context.setSuccess(true); } } catch (Exception e) { // TODO: handle exception e.printStackTrace(); } } |