Browse Source

quartz

master
zhizhi wu 5 years ago
parent
commit
e89ff67e56
  1. 2
      pom.xml
  2. 18
      scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java
  3. 4
      scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java
  4. 7
      scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java
  5. 30
      scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java
  6. 2
      scheduler/src/main/resources/application-dev.yml
  7. 26
      scheduler/src/main/resources/application-test.yml

2
pom.xml

@ -18,7 +18,7 @@
<parent> <parent>
<groupId>org.springframework.boot</groupId> <groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId> <artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version> <version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository --> <relativePath/> <!-- lookup parent from repository -->
</parent> </parent>

18
scheduler/src/main/java/com/ccsens/scheduler/api/JobController.java

@ -44,25 +44,29 @@ public class JobController {
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok();
} }
@ApiOperation(value = "/停止任务",notes = "")
@ApiImplicitParams({
})
@RequestMapping(value="pause",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"}) @RequestMapping(value="pause",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse pause(String jobName) { public JsonResponse pause(String jobName) {
log.info("停止任务"); log.info("停止任务");
quartzJobUtil.pauseJob(jobName); quartzJobUtil.pauseJob(jobName);
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok();
} }
@ApiOperation(value = "/恢复任务",notes = "")
@PostMapping("/resume") @ApiImplicitParams({
@ResponseBody })
@RequestMapping(value="resume",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse resume(String jobName) { public JsonResponse resume(String jobName) {
log.info("恢复任务"); log.info("恢复任务");
quartzJobUtil.removeJob(jobName); quartzJobUtil.removeJob(jobName);
return JsonResponse.newInstance().ok(); return JsonResponse.newInstance().ok();
} }
@ApiOperation(value = "/移除任务",notes = "")
@PostMapping("/remove") @ApiImplicitParams({
@ResponseBody })
@RequestMapping(value="remove",method = RequestMethod.POST,produces = {"application/json;charset=UTF-8"})
public JsonResponse remove(String jobName) { public JsonResponse remove(String jobName) {
log.info("移除任务"); log.info("移除任务");
quartzJobUtil.removeJob(jobName); quartzJobUtil.removeJob(jobName);

4
scheduler/src/main/java/com/ccsens/scheduler/bean/dto/QuartzJobModule.java

@ -52,6 +52,10 @@ public class QuartzJobModule {
* cron表达式 * cron表达式
*/ */
private String cron; private String cron;
/**
* misfire对应的处理规则
*/
private String misfirePolicy = "withMisfireHandlingInstructionDoNothing";
/** /**
* job的附加信息 * job的附加信息
*/ */

7
scheduler/src/main/java/com/ccsens/scheduler/service/TestJobDetail.java

@ -17,6 +17,11 @@ public class TestJobDetail extends QuartzJobBean {
protected void executeInternal(JobExecutionContext context) throws JobExecutionException { protected void executeInternal(JobExecutionContext context) throws JobExecutionException {
log.info("begin delwith batch task >>>>>>>>>>>>>>>>>>>>>>>"); log.info("begin delwith batch task >>>>>>>>>>>>>>>>>>>>>>>");
String batchId = context.getJobDetail().getKey().getName(); String batchId = context.getJobDetail().getKey().getName();
log.info("执行的任务id为:[{}]", batchId); // try {
// Thread.sleep(200);
// } catch (InterruptedException e) {
// e.printStackTrace();
// }
log.info("[{}]执行的任务id为:[{}]", System.currentTimeMillis(), batchId);
} }
} }

30
scheduler/src/main/java/com/ccsens/scheduler/util/QuartzJobUtil.java

@ -36,6 +36,7 @@ public class QuartzJobUtil {
.setJobData(quartzModel.getJobDataMap()).build(); .setJobData(quartzModel.getJobDataMap()).build();
// 表达式调度构建器 // 表达式调度构建器
CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzModel.getCron()); CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(quartzModel.getCron());
scheduleBuilder = handleCronScheduleMisfirePolicy(quartzModel, scheduleBuilder);
// 按新的cronExpression表达式构建一个新的trigger // 按新的cronExpression表达式构建一个新的trigger
TriggerBuilder<Trigger> builder = TriggerBuilder.newTrigger() TriggerBuilder<Trigger> builder = TriggerBuilder.newTrigger()
.withIdentity(quartzModel.getTriggerName(), quartzModel.getTriggerGroupName()); .withIdentity(quartzModel.getTriggerName(), quartzModel.getTriggerGroupName());
@ -45,6 +46,8 @@ public class QuartzJobUtil {
if (quartzModel.getEndTime() != null) { if (quartzModel.getEndTime() != null) {
builder.endAt(quartzModel.getEndTime()); builder.endAt(quartzModel.getEndTime());
} }
Trigger trigger = builder.withSchedule(scheduleBuilder).build(); Trigger trigger = builder.withSchedule(scheduleBuilder).build();
scheduler.scheduleJob(job, trigger); scheduler.scheduleJob(job, trigger);
// 启动 // 启动
@ -53,7 +56,7 @@ public class QuartzJobUtil {
} }
} }
catch (Exception e) { catch (Exception e) {
log.error("Add quartz job error, jobName = {}", quartzModel.getJobName()); log.error("Add quartz job error, jobName = {}", quartzModel.getJobName(), e);
} }
} }
@ -62,6 +65,29 @@ public class QuartzJobUtil {
} }
} }
public static CronScheduleBuilder handleCronScheduleMisfirePolicy(QuartzJobModule job, CronScheduleBuilder cb)
throws Exception {
switch (job.getMisfirePolicy()) {
case "withMisfireHandlingInstructionIgnoreMisfires":
//以错过的第一个频率时间立刻开始执行
//重做错过的所有频率周期后
//当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
return cb.withMisfireHandlingInstructionIgnoreMisfires();
case "withMisfireHandlingInstructionFireAndProceed":
//以错过的第一个频率时间立刻开始执行
//——重做错过的所有频率周期后
//——当下一次触发频率发生时间大于当前时间后,再按照正常的Cron频率依次执行
return cb.withMisfireHandlingInstructionFireAndProceed();
case "withMisfireHandlingInstructionDoNothing":
// 不触发立即执行
// 等待下次Cron触发频率到达时刻开始按照Cron频率依次执行
return cb.withMisfireHandlingInstructionDoNothing();
default:
throw new Exception("The task misfire policy '" + job.getMisfirePolicy() + "' cannot be used in cron schedule tasks");
}
}
/** /**
* @Description: 修改一个任务的触发时间(使用默认的任务组名触发器名触发器组名) * @Description: 修改一个任务的触发时间(使用默认的任务组名触发器名触发器组名)
* @param jobName * @param jobName
@ -182,7 +208,7 @@ public class QuartzJobUtil {
TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME); TriggerKey triggerKey = TriggerKey.triggerKey(jobName, Constant.Quartz.QZ_TRIGGER_GROUP_NAME);
JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME); JobKey jobKey = JobKey.jobKey(jobName, Constant.Quartz.QZ_JOB_GROUP_NAME);
try { try {
Trigger trigger = (Trigger) scheduler.getTrigger(triggerKey); Trigger trigger = scheduler.getTrigger(triggerKey);
if (trigger == null) { if (trigger == null) {
return; return;
} }

2
scheduler/src/main/resources/application-dev.yml

@ -1,5 +1,5 @@
server: server:
port: 8001 port: 8000
spring: spring:
snowflake: snowflake:
datacenterId: 1 datacenterId: 1

26
scheduler/src/main/resources/application-test.yml

@ -18,6 +18,32 @@ spring:
password: '' password: ''
port: 6379 port: 6379
timeout: 1000ms timeout: 1000ms
quartz:
#相关属性配置
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:
#always never
initialize-schema: never
swagger: swagger:
enable: true enable: true

Loading…
Cancel
Save