From 125b91e6b081244ef345869256b2fe4dcf6c1264 Mon Sep 17 00:00:00 2001 From: zhizhi wu <2377881365@qq.com> Date: Wed, 30 Jun 2021 18:21:14 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9A=E6=97=B6=E4=BB=BB=E5=8A=A1?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../main/resources/application-dev.properties | 6 +- .../src/main/resources/application.properties | 2 +- pom.xml | 2 +- scheduler/pom.xml | 27 +- .../scheduler/SchedulerApplication.java | 15 + .../ccsens/scheduler/api/DebugController.java | 31 ++ .../ccsens/scheduler/api/JobController.java | 71 ++++ .../scheduler/bean/dto/QuartzJobModule.java | 73 ++++ .../scheduler/config/SchedulerConfig.java | 64 +++ .../scheduler/service/TestJobDetail.java | 22 + .../com/ccsens/scheduler/util/CodeEnum.java | 10 +- .../com/ccsens/scheduler/util/Constant.java | 6 + .../ccsens/scheduler/util/QuartzJobUtil.java | 375 ++++++++++++++++++ .../src/main/resources/application-dev.yml | 49 +++ 14 files changed, 725 insertions(+), 28 deletions(-) create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/api/DebugController.java create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/config/SchedulerConfig.java create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java create mode 100644 scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java diff --git a/ccmq/src/main/resources/application-dev.properties b/ccmq/src/main/resources/application-dev.properties index f14eb93..54ed864 100644 --- a/ccmq/src/main/resources/application-dev.properties +++ b/ccmq/src/main/resources/application-dev.properties @@ -22,10 +22,10 @@ spring.redis.jedis.pool.min-idle=0 # RabbitMQ配置信息 #spring.rabbitmq.host=49.233.89.188 #spring.rabbitmq.host=192.168.0.99 -spring.rabbitmq.host=127.0.0.1 +spring.rabbitmq.host=49.233.89.188 spring.rabbitmq.port=5672 -spring.rabbitmq.username=guest -spring.rabbitmq.password=guest +spring.rabbitmq.username=admin +spring.rabbitmq.password=111111 # spring.rabbitmq.listener.simple.acknowledge-mode=manual # MongoDB配置信息 diff --git a/ccmq/src/main/resources/application.properties b/ccmq/src/main/resources/application.properties index dd8b329..47021f7 100644 --- a/ccmq/src/main/resources/application.properties +++ b/ccmq/src/main/resources/application.properties @@ -1,5 +1,5 @@ # 选择开发环境{dev|test|prod} -spring.profiles.active=test +spring.profiles.active=dev # 设置应用名 spring.application.name=tall-message diff --git a/pom.xml b/pom.xml index 4899498..fcee785 100644 --- a/pom.xml +++ b/pom.xml @@ -9,7 +9,7 @@ eureka ccmq histrixmonitor - + scheduler com.ccsens common diff --git a/scheduler/pom.xml b/scheduler/pom.xml index 37bc202..4d3d2e6 100644 --- a/scheduler/pom.xml +++ b/scheduler/pom.xml @@ -12,8 +12,12 @@ scheduler - + + org.springframework.boot + spring-boot-starter-quartz + + - - org.springframework.boot - spring-boot-starter-data-redis - + --> @@ -36,16 +35,16 @@ - + + <!– 鑷姩閲嶈繛–> com.spring4all mongodb-plus-spring-boot-starter 1.0.0.RELEASE - + --> @@ -55,11 +54,11 @@ - + @@ -103,11 +102,11 @@ - + com.jayway.jsonpath diff --git a/scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java b/scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java index 9c95632..45729b3 100644 --- a/scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java +++ b/scheduler/src/main/java/com/ccsens/scheduler/SchedulerApplication.java @@ -1,9 +1,24 @@ package com.ccsens.scheduler; +import org.mybatis.spring.annotation.MapperScan; +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.boot.web.servlet.ServletComponentScan; +import org.springframework.scheduling.annotation.EnableAsync; +import org.springframework.scheduling.annotation.EnableScheduling; + /** * @description: * @author: whj * @time: 2021/2/20 17:39 */ +@EnableScheduling +@MapperScan(basePackages = {"com.ccsens.scheduler.persist.*"}) +@ServletComponentScan +@EnableAsync +@SpringBootApplication(scanBasePackages = "com.ccsens.scheduler") public class SchedulerApplication { + public static void main(String[] args) { + SpringApplication.run(SchedulerApplication.class, args); + } } diff --git a/scheduler/src/main/java/com/ccsens/scheduler/api/DebugController.java b/scheduler/src/main/java/com/ccsens/scheduler/api/DebugController.java new file mode 100644 index 0000000..ed855e9 --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/api/DebugController.java @@ -0,0 +1,31 @@ +package com.ccsens.scheduler.api; + + +import io.swagger.annotations.Api; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import lombok.extern.slf4j.Slf4j; +import org.springframework.web.bind.annotation.RequestMapping; +import org.springframework.web.bind.annotation.RequestMethod; +import org.springframework.web.bind.annotation.RestController; + +import javax.servlet.http.HttpServletRequest; +import com.ccsens.scheduler.util.JsonResponse; + +@Api(tags = "DEBUG" , description = "DebugController | ") +@RestController +@RequestMapping("/debug") +@Slf4j +public class DebugController { + + @ApiOperation(value = "/娴嬭瘯",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value="",method = RequestMethod.GET,produces = {"application/json;charset=UTF-8"}) + public JsonResponse debug(HttpServletRequest request) throws Exception { + + return JsonResponse.newInstance().ok("娴嬭瘯"); + } + + +} diff --git a/scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java b/scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java new file mode 100644 index 0000000..091f3f7 --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java @@ -0,0 +1,71 @@ +package com.ccsens.scheduler.api; + +import com.ccsens.scheduler.bean.dto.QuartzJobModule; +import com.ccsens.scheduler.util.JsonResponse; +import com.ccsens.scheduler.util.QuartzJobUtil; +import io.swagger.annotations.ApiImplicitParams; +import io.swagger.annotations.ApiOperation; +import io.swagger.annotations.ApiParam; +import lombok.extern.slf4j.Slf4j; +import org.springframework.validation.annotation.Validated; +import org.springframework.web.bind.annotation.*; + +import javax.annotation.Resource; + +/** + * @description: + * @author: whj + * @time: 2021/6/30 16:26 + */ +@Slf4j +@RestController +@RequestMapping("/job") +public class JobController { + + @Resource + private QuartzJobUtil quartzJobUtil; + + @ApiOperation(value = "/娣诲姞浠诲姟",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value="add",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse add(@ApiParam @Validated @RequestBody QuartzJobModule job) { + quartzJobUtil.addJob(job); + return JsonResponse.newInstance().ok(); + } + + + @ApiOperation(value = "/淇敼浠诲姟鏃堕棿",notes = "") + @ApiImplicitParams({ + }) + @RequestMapping(value="modifyTime",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse modifyTime(@ApiParam @Validated @RequestBody QuartzJobModule job) { + quartzJobUtil.modifyJobTime(job.getJobName(), job.getJobGroupName(), job.getCron()); + return JsonResponse.newInstance().ok(); + } + + + @RequestMapping(value="pause",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) + public JsonResponse pause(String jobName) { + log.info("鍋滄浠诲姟"); + quartzJobUtil.pauseJob(jobName); + return JsonResponse.newInstance().ok(); + } + + @PostMapping("/resume") + @ResponseBody + public JsonResponse resume(String jobName) { + log.info("鎭㈠浠诲姟"); + quartzJobUtil.removeJob(jobName); + return JsonResponse.newInstance().ok(); + + } + + @PostMapping("/remove") + @ResponseBody + public JsonResponse remove(String jobName) { + log.info("绉婚櫎浠诲姟"); + quartzJobUtil.removeJob(jobName); + return JsonResponse.newInstance().ok(); + } +} diff --git a/scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java b/scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java new file mode 100644 index 0000000..2a6c38c --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java @@ -0,0 +1,73 @@ +package com.ccsens.scheduler.bean.dto; + +import cn.hutool.core.util.StrUtil; +import com.ccsens.scheduler.util.Constant; +import com.fasterxml.jackson.annotation.JsonFormat; +import lombok.Data; +import org.quartz.Job; +import org.quartz.JobDataMap; +import org.quartz.JobExecutionContext; +import org.springframework.util.ClassUtils; + +import java.util.Date; + +/** + * @description: + * @author: whj + * @time: 2021/6/30 16:00 + */ +@Data +public class QuartzJobModule { + /** + * 瑙﹀彂鍣ㄥ紑濮嬫椂闂 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date startTime; + /** + * 瑙﹀彂鍣ㄧ粨鏉熸椂闂 + */ + @JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss") + private Date endTime; + /** + * job鍚嶇О + */ + private String jobName; + /** + * job缁勫悕 + */ + private String jobGroupName = Constant.Quartz.QZ_JOB_GROUP_NAME; + /** + * 瀹氭椂鍣ㄥ悕绉 + */ + private String triggerName; + /** + * 瀹氭椂鍣ㄧ粍鍚 + */ + private String triggerGroupName = Constant.Quartz.QZ_TRIGGER_GROUP_NAME; + /** + * 鎵ц瀹氭椂浠诲姟鐨勫叿浣撴搷浣 + */ + private String jobClass; + /** + * cron琛ㄨ揪寮 + */ + private String cron; + /** + * job鐨勯檮鍔犱俊鎭 + */ + private JobDataMap jobDataMap = new JobDataMap(); + /** + * 鏍¢獙 + * @return + */ + public boolean verify(){ + return !(StrUtil.isEmpty(jobName) + || StrUtil.isEmpty(jobGroupName) + || StrUtil.isEmpty(triggerName) + || StrUtil.isEmpty(triggerGroupName) + || StrUtil.isEmpty(cron) + || !ClassUtils.hasMethod(Job.class, "execute", JobExecutionContext.class) + ); + } + +} diff --git a/scheduler/src/main/java/com/ccsens/scheduler/config/SchedulerConfig.java b/scheduler/src/main/java/com/ccsens/scheduler/config/SchedulerConfig.java new file mode 100644 index 0000000..745a507 --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/config/SchedulerConfig.java @@ -0,0 +1,64 @@ +package com.ccsens.scheduler.config; + +import cn.hutool.core.io.resource.ClassPathResource; +import org.quartz.Scheduler; +import org.quartz.ee.servlet.QuartzInitializerListener; +import org.springframework.beans.factory.config.PropertiesFactoryBean; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.scheduling.quartz.SchedulerFactoryBean; + +import java.io.IOException; +import java.util.Properties; + +/** + * @description: + * @author: whj + * @time: 2021/6/30 15:48 + */ +@Configuration +public class SchedulerConfig { + /** + * 璇诲彇quartz.properties 鏂囦欢 + * 灏嗗煎垵濮嬪寲 + * @return + */ + @Bean + public Properties quartzProperties() throws IOException { + PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean(); + propertiesFactoryBean.setLocation(new ClassPathResource("/quartz.properties")); + propertiesFactoryBean.afterPropertiesSet(); + return propertiesFactoryBean.getObject(); + } + + /** + * 灏嗛厤缃枃浠剁殑鏁版嵁鍔犺浇鍒癝chedulerFactoryBean涓 + * @return + * @throws IOException + */ + @Bean + public SchedulerFactoryBean schedulerFactoryBean() throws IOException { + SchedulerFactoryBean schedulerFactoryBean = new SchedulerFactoryBean(); + schedulerFactoryBean.setQuartzProperties(); + return schedulerFactoryBean; + } + + /** + * 鍒濆鍖栫洃鍚櫒 + * @return + */ + @Bean + public QuartzInitializerListener executorListener(){ + return new QuartzInitializerListener(); + } + + /** + * 鑾峰緱Scheduler 瀵硅薄 + * @return + * @throws IOException + */ + @Bean + public Scheduler scheduler() throws IOException { + return schedulerFactoryBean().getScheduler(); + } +} diff --git a/scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java b/scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java new file mode 100644 index 0000000..095419e --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java @@ -0,0 +1,22 @@ +package com.ccsens.scheduler.service; + +import lombok.extern.slf4j.Slf4j; +import org.quartz.DisallowConcurrentExecution; +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.springframework.scheduling.quartz.QuartzJobBean; + +/** + * @author: whj + * @time: 2021/6/30 16:22 + */ +@DisallowConcurrentExecution// 绂佹骞跺彂鎵ц +@Slf4j +public class TestJobDetail extends QuartzJobBean { + @Override + protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + log.info("begin delwith batch task >>>>>>>>>>>>>>>>>>>>>>>"); + String batchId = context.getJobDetail().getKey().getName(); + log.info("鎵ц鐨勪换鍔d涓猴細[{}]", batchId); + } +} diff --git a/scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java b/scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java index 4d41cd4..ac5ec87 100644 --- a/scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java +++ b/scheduler/src/main/java/com/ccsens/scheduler/util/CodeEnum.java @@ -12,16 +12,8 @@ public enum CodeEnum { FILE_FORMAT_ERROR(1, "鏂囦欢鏍煎紡閿欒", true), PARAM_NULL(6, "璇锋鏌ユ偍鐨勫弬鏁版槸鍚﹀~鍐欏畬鏁淬", true), - - - - ; - public CodeEnum addMsg(String msg){ - this.msg = msg+"琛岋細"+this.msg; - return this; - } public static CodeEnum getByCode(int code) { for (CodeEnum codeEnum: CodeEnum.values()) { if (codeEnum.getCode() == code) { @@ -31,7 +23,7 @@ public enum CodeEnum { return null; } - private CodeEnum(Integer code, String msg, boolean success) { + CodeEnum(Integer code, String msg, boolean success) { this.code = code; this.msg = msg; this.success = success; diff --git a/scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java b/scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java index ad0853d..f9dfc83 100644 --- a/scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java +++ b/scheduler/src/main/java/com/ccsens/scheduler/util/Constant.java @@ -26,6 +26,12 @@ public class Constant { } } + public static class Quartz { + public static final String QZ_JOB_GROUP_NAME = "JOB_GROUP_NAME"; + public static final String QZ_TRIGGER_GROUP_NAME = "TRIGGER_GROUP_NAME"; + + } + diff --git a/scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java b/scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java new file mode 100644 index 0000000..d8665a7 --- /dev/null +++ b/scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java @@ -0,0 +1,375 @@ +package com.ccsens.scheduler.util; + +import com.ccsens.scheduler.bean.dto.QuartzJobModule; +import lombok.extern.slf4j.Slf4j; +import org.quartz.*; +import org.quartz.impl.triggers.CronTriggerImpl; +import org.springframework.stereotype.Component; + +import javax.annotation.Resource; +import java.text.ParseException; +import java.text.SimpleDateFormat; +import java.util.ArrayList; +import java.util.Date; +import java.util.List; + +/** + * @description: + * @author: whj + * @time: 2021/6/30 16:03 + */ +@Slf4j +@Component +public class QuartzJobUtil { + @Resource + private Scheduler scheduler; + + /** + * @Description: 娣诲姞涓涓畾鏃朵换鍔 + * @param quartzModel + */ + public void addJob(QuartzJobModule quartzModel) { + if (quartzModel.verify()) { + try { + JobDetail job = JobBuilder.newJob((Class) Class.forName(quartzModel.getJobClass())) + .withIdentity(quartzModel.getJobName(), quartzModel.getJobGroupName()) + .setJobData(quartzModel.getJobDataMap()).build(); + // 琛ㄨ揪寮忚皟搴︽瀯寤哄櫒 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzModel.getCron()); + // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忔瀯寤轰竴涓柊鐨則rigger + TriggerBuilder builder = TriggerBuilder.newTrigger() + .withIdentity(quartzModel.getTriggerName(), quartzModel.getTriggerGroupName()); + if (quartzModel.getStartTime() != null) { + builder.startAt(quartzModel.getStartTime()); + } + if (quartzModel.getEndTime() != null) { + builder.endAt(quartzModel.getEndTime()); + } + Trigger trigger = builder.withSchedule(scheduleBuilder).build(); + scheduler.scheduleJob(job, trigger); + // 鍚姩 + if (!scheduler.isShutdown()) { + scheduler.start(); + } + } + catch (Exception e) { + log.error("Add quartz job error, jobName = {}", quartzModel.getJobName()); + } + + } + else { + log.error("QuartzModel is invalid!"); + } + } + + /** + * @Description: 淇敼涓涓换鍔$殑瑙﹀彂鏃堕棿(浣跨敤榛樿鐨勪换鍔$粍鍚嶏紝瑙﹀彂鍣ㄥ悕锛岃Е鍙戝櫒缁勫悕) + * @param jobName + * @param cron + */ + public void modifyJobTime(String jobName, String cron, Date startDate, Date endDate) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME); + + try { + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忛噸鏂版瀯寤簍rigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey) + .startAt(startDate) + .endAt(endDate).withSchedule(scheduleBuilder).build(); + // 鎸夋柊鐨則rigger閲嶆柊璁剧疆job鎵ц + scheduler.rescheduleJob(triggerKey, trigger); + } + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description:淇敼浠诲姟锛岋紙鍙互淇敼浠诲姟鍚嶏紝浠诲姟绫伙紝瑙﹀彂鏃堕棿锛 + * 鍘熺悊锛氱Щ闄ゅ師鏉ョ殑浠诲姟锛屾坊鍔犳柊鐨勪换鍔 + * @param oldJobName + * 锛氬師浠诲姟鍚 + * @param jobName + * @param jobclass + * @param cron + */ + public void modifyJob(String oldJobName, String jobName, Class jobclass, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(oldJobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(oldJobName, Constant.Quartz.QZ_JOB_GROUP_NAME); + try { + // 浠诲姟涓嶅瓨鍦 + if (removeJob(oldJobName, triggerKey, jobKey)) { + return; + } + + JobDetail job = JobBuilder.newJob(jobclass).withIdentity(jobName, + Constant.Quartz.QZ_JOB_GROUP_NAME) + .build(); + // 琛ㄨ揪寮忚皟搴︽瀯寤哄櫒 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忔瀯寤轰竴涓柊鐨則rigger + Trigger newTrigger = TriggerBuilder.newTrigger().withIdentity(jobName, + Constant.Quartz.QZ_TRIGGER_GROUP_NAME) + .withSchedule(scheduleBuilder).build(); + + // 浜ょ粰scheduler鍘昏皟搴 + scheduler.scheduleJob(job, newTrigger); + + // 鍚姩 + if (!scheduler.isShutdown()) { + scheduler.start(); + System.err.println("娣诲姞鏂颁换鍔:" + jobName); + } + System.err.println("淇敼浠诲姟銆" + oldJobName + "銆戜负:" + jobName); + } + catch (Exception e) { + throw new RuntimeException(e); + } + + } + + private boolean removeJob(String oldJobName, TriggerKey triggerKey, JobKey jobKey) throws SchedulerException { + Trigger trigger = scheduler.getTrigger(triggerKey); + if (trigger == null) { + return true; + } + // 鍋滄瑙﹀彂鍣 + deleteJob(triggerKey, jobKey); + System.err.println("绉婚櫎浠诲姟:" + oldJobName); + return false; + } + + /** + * @Description: 淇敼涓涓换鍔$殑瑙﹀彂鏃堕棿 + * @param triggerName + * @param triggerGroupName + * @param cron + */ + public void modifyJobTime(String triggerName, String triggerGroupName, String cron) { + TriggerKey triggerKey = TriggerKey.triggerKey(triggerName, triggerGroupName); + try { + CronTrigger trigger = (CronTrigger) scheduler.getTrigger(triggerKey); + if (trigger == null) { + return; + } + String oldTime = trigger.getCronExpression(); + if (!oldTime.equalsIgnoreCase(cron)) { + // trigger宸插瓨鍦紝鍒欐洿鏂扮浉搴旂殑瀹氭椂璁剧疆 + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cron); + // 鎸夋柊鐨刢ronExpression琛ㄨ揪寮忛噸鏂版瀯寤簍rigger + trigger = trigger.getTriggerBuilder().withIdentity(triggerKey).withSchedule(scheduleBuilder).build(); + // 鎸夋柊鐨則rigger閲嶆柊璁剧疆job鎵ц + scheduler.resumeTrigger(triggerKey); + } + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description 绉婚櫎涓涓换鍔(浣跨敤榛樿鐨勪换鍔$粍鍚嶏紝瑙﹀彂鍣ㄥ悕锛岃Е鍙戝櫒缁勫悕) + * @param jobName + */ + public void removeJob(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME); + JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME); + try { + Trigger trigger = (Trigger) scheduler.getTrigger(triggerKey); + if (trigger == null) { + return; + } + deleteJob(triggerKey, jobKey); + System.err.println("绉婚櫎浠诲姟:" + jobName); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + private void deleteJob(TriggerKey triggerKey, JobKey jobKey) throws SchedulerException { + // 鍋滄瑙﹀彂鍣 + scheduler.pauseTrigger(triggerKey); + // 绉婚櫎瑙﹀彂鍣 + scheduler.unscheduleJob(triggerKey); + // 鍒犻櫎浠诲姟 + scheduler.deleteJob(jobKey); + } + + /** + * @Description: 绉婚櫎涓涓换鍔 + * @param jobName + * @param jobGroupName + * @param triggerName + * @param triggerGroupName + */ + public void removeJob(String jobName, String jobGroupName, String triggerName, String triggerGroupName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, triggerGroupName); + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + deleteJob(triggerKey, jobKey); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description:鏆傚仠涓涓换鍔(浣跨敤榛樿缁勫悕) + * @param jobName + */ + public void pauseJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME); + try { + scheduler.pauseJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description:鏆傚仠涓涓换鍔 + * @param jobName + * @param jobGroupName + */ + public void pauseJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + scheduler.pauseJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description:鎭㈠涓涓换鍔(浣跨敤榛樿缁勫悕) + * @param jobName + */ + public void resumeJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME); + try { + scheduler.resumeJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description:鎭㈠涓涓换鍔 + * @param jobName + * @param jobGroupName + */ + public void resumeJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + scheduler.resumeJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description:鍚姩鎵鏈夊畾鏃朵换鍔 + */ + public void startJobs() { + try { + scheduler.start(); + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description 鍏抽棴鎵鏈夊畾鏃朵换鍔 + */ + public void shutdownJobs() { + try { + if (!scheduler.isShutdown()) { + scheduler.shutdown(); + } + } + catch (Exception e) { + throw new RuntimeException(e); + } + } + + /** + * @Description: 绔嬪嵆杩愯浠诲姟锛岃繖閲岀殑绔嬪嵆杩愯锛屽彧浼氳繍琛屼竴娆★紝鏂逛究娴嬭瘯鏃剁敤銆 + * @param jobName + */ + public void triggerJob(String jobName) { + JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME); + try { + scheduler.triggerJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description: 绔嬪嵆杩愯浠诲姟锛岃繖閲岀殑绔嬪嵆杩愯锛屽彧浼氳繍琛屼竴娆★紝鏂逛究娴嬭瘯鏃剁敤銆 + * @param jobName + * @param jobGroupName + */ + public void triggerJob(String jobName, String jobGroupName) { + JobKey jobKey = JobKey.jobKey(jobName, jobGroupName); + try { + scheduler.triggerJob(jobKey); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + } + + /** + * @Description: 鑾峰彇浠诲姟鐘舵 + * @param jobName + * 瑙﹀彂鍣ㄥ悕 + */ + public String getTriggerState(String jobName) { + TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME); + String name = null; + try { + Trigger.TriggerState triggerState = scheduler.getTriggerState(triggerKey); + name = triggerState.name(); + } + catch (SchedulerException e) { + e.printStackTrace(); + } + return name; + } + + /** + * @Description:鑾峰彇鏈杩5娆℃墽琛屾椂闂 + * @param cron + */ + public List getRecentTriggerTime(String cron) { + List list = new ArrayList(); + try { + CronTriggerImpl cronTriggerImpl = new CronTriggerImpl(); + cronTriggerImpl.setCronExpression(cron); + List dates = TriggerUtils.computeFireTimes(cronTriggerImpl, null, 5); + SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); + for (Date date : dates) { + list.add(dateFormat.format(date)); + } + } + catch (ParseException e) { + log.error("GetRecentTriggerTime error, cron = {}", cron, e); + } + return list; + } +} diff --git a/scheduler/src/main/resources/application-dev.yml b/scheduler/src/main/resources/application-dev.yml index 0f080a1..618d137 100644 --- a/scheduler/src/main/resources/application-dev.yml +++ b/scheduler/src/main/resources/application-dev.yml @@ -6,6 +6,38 @@ spring: workerId: 1 datasource: type: com.alibaba.druid.pool.DruidDataSource + quartz: + # dataSource: + # default: + # driver: com.mysql.jdbc.Driver + # URL: jdbc:mysql://localhost:3306/jobconfig?useUnicode=true&characterEncoding=utf8 + # user: root + # password: 12345678 + # maxConnections: 5 + #鐩稿叧灞炴ч厤缃 + properties: + org: + quartz: + scheduler: + instanceName: quartzScheduler + instanceId: AUTO + jobStore: + class: org.quartz.impl.jdbcjobstore.JobStoreTX + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: qrtz_ + isClustered: false + clusterCheckinInterval: 10000 + useProperties: false + threadPool: + class: org.quartz.simpl.SimpleThreadPool + threadCount: 10 + threadPriority: 5 + threadsInheritContextClassLoaderOfInitializingThread: true + #鏁版嵁搴撴柟寮 + job-store-type: JDBC + #鍒濆鍖栬〃缁撴瀯 + jdbc: + initialize-schema: always redis: database: 0 host: 127.0.0.1 @@ -18,5 +50,22 @@ spring: password: '' port: 6379 timeout: 1000ms + rabbitmq: + host: 192.168.4.113 + password: 111111 + port: 5672 + username: admin + redis: + database: 0 + host: 127.0.0.1 + jedis: + pool: + max-active: 200 + max-idle: 10 + max-wait: -1ms + min-idle: 0 + password: '' + port: 6379 + timeout: 1000ms swagger: enable: true \ No newline at end of file