springboot quartz动态任务处理
生活随笔
收集整理的這篇文章主要介紹了
springboot quartz动态任务处理
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
現實中的很多定時任務并不像網上的那種寫法那么簡單都是直接通過注解的形式實現(@Scheduled(fixedRate = 10000))。我就遇到了從數據庫讀取相關的數據(可能有n條)然后根據數據的觸發時間生成多個動態任務添加到Scheduler中,當到達觸發點時自動觸發該任務。
廢話不多說,直接上代碼:
核心調度類:
package com.xx.task;import org.apache.commons.lang3.StringUtils; import org.quartz.*; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Component;import java.text.SimpleDateFormat; import java.util.Date; import java.util.Map;/*** @author xiaofeng* @version V1.0* @title: CustomQuartzScheduler* @package: com.xx.task* @description: 自定義job* @date 2019/4/19 10:32*/ @Component public class CustomQuartzScheduler {private Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate Scheduler scheduler;/*** 開始執行所有任務*/public void startJob() {try {scheduler.start();} catch (SchedulerException e) {e.printStackTrace();}}/*** 獲取job信息** @param jobName* @param groupName* @return*/public String getJobInfo(String jobName, String groupName) {TriggerKey triggerKey = new TriggerKey(jobName, groupName);CronTrigger cronTrigger = null;try {cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);return String.format("time:%s,state:%s", cronTrigger.getCronExpression(),scheduler.getTriggerState(triggerKey).name());} catch (SchedulerException e) {e.printStackTrace();}return null;}/*** 修改某個任務的執行時間** @param jobName* @param groupName* @param cronExpress* @return*/public boolean modifyJobWithCronExpress(String jobName, String groupName, String cronExpress) {Date date = null;TriggerKey triggerKey = new TriggerKey(jobName, groupName);CronTrigger cronTrigger = null;try {cronTrigger = (CronTrigger) scheduler.getTrigger(triggerKey);String oldTime = cronTrigger.getCronExpression();if (!oldTime.equalsIgnoreCase(cronExpress)) {CronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpress);CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(cronScheduleBuilder).build();date = scheduler.rescheduleJob(triggerKey, trigger);}return date != null;} catch (SchedulerException e) {e.printStackTrace();}return false;}/*** 修改某個任務的執行時間** @param jobName* @param groupName* @param startAt* @param endAt* @return*/public boolean modifyJobWithTime(String jobName, String groupName, Date startAt, Date endAt) {Date date = null;TriggerKey triggerKey = new TriggerKey(jobName, groupName);Trigger oldTrigger = null;try {oldTrigger = scheduler.getTrigger(triggerKey);Date startTime = oldTrigger.getStartTime();Date endTime = oldTrigger.getEndTime();TriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().withIdentity(jobName, groupName);if (startTime.compareTo(startAt) != 0) {triggerBuilder.startAt(startAt);}if (endTime.compareTo(endAt) != 0) {triggerBuilder.endAt(endAt);}Trigger trigger = triggerBuilder.build();date = scheduler.rescheduleJob(triggerKey, trigger);return date != null;} catch (SchedulerException e) {e.printStackTrace();}return false;}/*** 暫停所有任務*/public void pauseAllJob() {try {scheduler.pauseAll();} catch (SchedulerException e) {e.printStackTrace();}}/*** 暫停某個任務** @param jobName* @param groupName*/public void pauseJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.pauseJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** 恢復所有任務*/public void resumeAllJob() {try {scheduler.resumeAll();} catch (SchedulerException e) {e.printStackTrace();}}/*** 恢復某個任務** @param jobName* @param groupName*/public void resumeJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.resumeJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** 刪除某個任務** @param jobName* @param groupName*/public void deleteJob(String jobName, String groupName) {JobKey jobKey = new JobKey(jobName, groupName);JobDetail jobDetail = null;try {jobDetail = scheduler.getJobDetail(jobKey);if (jobDetail == null) {return;}scheduler.deleteJob(jobKey);} catch (SchedulerException e) {e.printStackTrace();}}/*** add job** @param jobName* @param groupName* @param cronExpress* @param clz execute class* @param params jobData*/public void addJobByCron(String jobName, String groupName, String cronExpress, Class clz, Map<String, String> params) {if (StringUtils.isBlank(cronExpress)) {logger.error("{} cronExpress can't be null, CronScheduleBuilder need cronExpress to execute ~ ");return;}// build jobJobBuilder jobBuilder = JobBuilder.newJob(clz);if (params != null) {params.entrySet().stream().forEach(stringObjectEntry -> {jobBuilder.usingJobData(stringObjectEntry.getKey(), stringObjectEntry.getValue());});}JobDetail jobDetail = jobBuilder.withIdentity(jobName, groupName).build();// build trigger base on CronTriggerCronScheduleBuilder cronScheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpress);CronTrigger cronTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, groupName).withSchedule(cronScheduleBuilder).build();try {scheduler.scheduleJob(jobDetail, cronTrigger);} catch (SchedulerException e) {e.printStackTrace();}}/*** add job** @param jobName* @param groupName* @param clz execute class* @param startAt startTime* @param endAt endTime* @param params jobData*/public void addJob(String jobName, String groupName, Class clz, Date startAt, Date endAt, Map<String, String> params) {if (startAt == null) {logger.error("{} startAt can't be null, TriggerBuilder need trigger time to execute ~ ");return;}//build jobJobBuilder jobBuilder = JobBuilder.newJob(clz);if (params != null) {params.entrySet().stream().forEach(stringObjectEntry -> {jobBuilder.usingJobData(stringObjectEntry.getKey(), stringObjectEntry.getValue());});}JobDetail jobDetail = jobBuilder.withIdentity(jobName, groupName).build();//build trigger base timeTriggerBuilder<Trigger> triggerBuilder = TriggerBuilder.newTrigger().startAt(startAt).withIdentity(jobName, groupName);if (endAt != null) {triggerBuilder.endAt(endAt);}Trigger trigger = triggerBuilder.build();try {scheduler.scheduleJob(jobDetail, trigger);} catch (SchedulerException e) {e.printStackTrace();}}}其中注意需要傳遞參數可以使用usingJobData這個方法。
通過啟動加載所有的任務到容器中:
package com.xx.init;import com.google.common.collect.Maps; import com.lema.rakeback.model.extra.CompanyInfoVo; import com.lema.rakeback.service.superm.CompanyInfoService; import com.lema.rakeback.task.CustomQuartzScheduler; import com.lema.rakeback.task.job.EnterpriseGrantEndJob; import com.lema.rakeback.task.job.EnterpriseGrantStartJob; import com.lema.rakeback.utils.DateUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.boot.ApplicationArguments; import org.springframework.boot.ApplicationRunner; import org.springframework.core.annotation.Order; import org.springframework.stereotype.Component; import org.springframework.util.CollectionUtils;import java.util.List; import java.util.Map;/*** @author xiaofeng* @version V1.0* @title: AppStartupRunner.java* @package: com.xx.init* @description: 服務器啟動加載數據* @date 2019/4/19 10:41*/ @Component @Order(value = 0) public class AppStartupRunner implements ApplicationRunner {Logger logger = LoggerFactory.getLogger(getClass());@Autowiredprivate CustomQuartzScheduler quartzScheduler;@Autowiredprivate CompanyInfoService companyInfoService;@Overridepublic void run(ApplicationArguments applicationArguments) {logger.info(">>>>>>>>>服務啟動后初始化操作,執行后臺job操作<<<<<<<<<");List<CompanyInfoVo> companyInfoVos = companyInfoService.queryForList(0, null, null, null, 0, Integer.MAX_VALUE);if (!CollectionUtils.isEmpty(companyInfoVos)) {companyInfoVos.stream().forEach(companyInfoVo -> {String jobName1 = "job_" + companyInfoVo.getId() + "_start";String groupName1 = "group_" + companyInfoVo.getId() + "_start";String jobName2 = "job_" + companyInfoVo.getId() + "_end";String groupName2 = "group_" + companyInfoVo.getId() + "_end";Map<String, String> params = Maps.newHashMap();params.put("id", String.valueOf(companyInfoVo.getId())); // quartzScheduler.addJob(jobName1, gropName1, EnterpriseGrantStartJob.class, DateUtil.string2date2(companyInfoVo.getStartTime()), null, params); // quartzScheduler.addJob(jobName2, groupName2, EnterpriseGrantEndJob.class, DateUtil.string2date2(companyInfoVo.getEndTime()), null, params);quartzScheduler.addJobByCron(jobName1, groupName1, DateUtil.getCron(DateUtil.string2date2(companyInfoVo.getStartTime())), EnterpriseGrantStartJob.class, params);quartzScheduler.addJobByCron(jobName2, groupName2, DateUtil.getCron(DateUtil.string2date2(companyInfoVo.getEndTime())), EnterpriseGrantEndJob.class, params);});}logger.info(">>>>>>>>>后臺job任務已經啟動...<<<<<<<<<");} }業務執行相關類:
package com.xx.task.job;import org.quartz.Job; import org.quartz.JobDataMap; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory;/*** @author xiaofeng* @version V1.0* @title: EnterpriseGrantStartJob* @package: com.xx.task.job* @description: 企業授權開始job* @date 2019/4/19 11:40*/ public class EnterpriseGrantStartJob implements Job {private Logger logger = LoggerFactory.getLogger(getClass());private void before() {logger.info("=================StartJob before===============");}@Overridepublic void execute(JobExecutionContext jobExecutionContext) throws JobExecutionException {before();JobDataMap jobDataMap = jobExecutionContext.getJobDetail().getJobDataMap();/*** @// TODO: 2019/4/19 獲取參數,執行業務 */Long id = jobDataMap.getLong("id");after();}private void after() {logger.info("=================StartJob before===============");}}注意:需要引入的pom依賴
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-quartz</artifactId></dependency>ok,啟動即可
總結
以上是生活随笔為你收集整理的springboot quartz动态任务处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 谷歌加强 Android 13 QPR2
- 下一篇: springboot动态数据源切换(多数