diff --git a/README.md b/README.md index 3de515b..352bd97 100644 --- a/README.md +++ b/README.md @@ -1,4 +1,9 @@ # SpringBootQuartz -Quartz with Spring Boot -Visit to see more details +- Quartz with Spring Boot +- 相关文章介绍: +- 启动项目后访问: +- 添加的时候: + - 任务名称填写 Job 类完整包路径 + 类名,比如:com.example.demo.job.NewJob + - 任务分组名称自己任意填写字符串。其中:**分组名+任务名称组成一个完整的唯一任务**。如果两者一样已经存在一样的,则无法添加成功,会抛异常:because one already exists with this identification + - 表达式填写Cron表达式,比如:`0/3 * * * * ?`,在线表达: \ No newline at end of file diff --git a/demo/doc/tables_mysql_innodb.sql b/demo/doc/tables_mysql_innodb.sql new file mode 100644 index 0000000..6e44c8e --- /dev/null +++ b/demo/doc/tables_mysql_innodb.sql @@ -0,0 +1,216 @@ +# +# In your Quartz properties file, you'll need to set +# org.quartz.jobStore.driverDelegateClass = org.quartz.impl.jdbcjobstore.StdJDBCDelegate +# +# +# By: Ron Cordell - roncordell +# I didn't see this anywhere, so I thought I'd post it here. This is the script from Quartz to create the tables in a MySQL database, modified to use INNODB instead of MYISAM. + + +CREATE DATABASE /*!32312 IF NOT EXISTS*/`springboot_quartz_jdbc` /*!40100 DEFAULT CHARACTER SET utf8 */; + +USE `springboot_quartz_jdbc`; + + +DROP TABLE IF EXISTS QRTZ_FIRED_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_PAUSED_TRIGGER_GRPS; +DROP TABLE IF EXISTS QRTZ_SCHEDULER_STATE; +DROP TABLE IF EXISTS QRTZ_LOCKS; +DROP TABLE IF EXISTS QRTZ_SIMPLE_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_SIMPROP_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_CRON_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_BLOB_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_TRIGGERS; +DROP TABLE IF EXISTS QRTZ_JOB_DETAILS; +DROP TABLE IF EXISTS QRTZ_CALENDARS; + +CREATE TABLE QRTZ_JOB_DETAILS ( + SCHED_NAME VARCHAR(120) NOT NULL, + JOB_NAME VARCHAR(190) NOT NULL, + JOB_GROUP VARCHAR(190) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + JOB_CLASS_NAME VARCHAR(250) NOT NULL, + IS_DURABLE VARCHAR(1) NOT NULL, + IS_NONCONCURRENT VARCHAR(1) NOT NULL, + IS_UPDATE_DATA VARCHAR(1) NOT NULL, + REQUESTS_RECOVERY VARCHAR(1) NOT NULL, + JOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_TRIGGERS ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + JOB_NAME VARCHAR(190) NOT NULL, + JOB_GROUP VARCHAR(190) NOT NULL, + DESCRIPTION VARCHAR(250) NULL, + NEXT_FIRE_TIME BIGINT(13) NULL, + PREV_FIRE_TIME BIGINT(13) NULL, + PRIORITY INTEGER NULL, + TRIGGER_STATE VARCHAR(16) NOT NULL, + TRIGGER_TYPE VARCHAR(8) NOT NULL, + START_TIME BIGINT(13) NOT NULL, + END_TIME BIGINT(13) NULL, + CALENDAR_NAME VARCHAR(190) NULL, + MISFIRE_INSTR SMALLINT(2) NULL, + JOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, JOB_NAME, JOB_GROUP) + REFERENCES QRTZ_JOB_DETAILS (SCHED_NAME, JOB_NAME, JOB_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_SIMPLE_TRIGGERS ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + REPEAT_COUNT BIGINT(7) NOT NULL, + REPEAT_INTERVAL BIGINT(12) NOT NULL, + TIMES_TRIGGERED BIGINT(10) NOT NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_CRON_TRIGGERS ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + CRON_EXPRESSION VARCHAR(120) NOT NULL, + TIME_ZONE_ID VARCHAR(80), + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_SIMPROP_TRIGGERS +( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + STR_PROP_1 VARCHAR(512) NULL, + STR_PROP_2 VARCHAR(512) NULL, + STR_PROP_3 VARCHAR(512) NULL, + INT_PROP_1 INT NULL, + INT_PROP_2 INT NULL, + LONG_PROP_1 BIGINT NULL, + LONG_PROP_2 BIGINT NULL, + DEC_PROP_1 NUMERIC(13, 4) NULL, + DEC_PROP_2 NUMERIC(13, 4) NULL, + BOOL_PROP_1 VARCHAR(1) NULL, + BOOL_PROP_2 VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_BLOB_TRIGGERS ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + BLOB_DATA BLOB NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + INDEX (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP), + FOREIGN KEY (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) + REFERENCES QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_CALENDARS ( + SCHED_NAME VARCHAR(120) NOT NULL, + CALENDAR_NAME VARCHAR(190) NOT NULL, + CALENDAR BLOB NOT NULL, + PRIMARY KEY (SCHED_NAME, CALENDAR_NAME) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_PAUSED_TRIGGER_GRPS ( + SCHED_NAME VARCHAR(120) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + PRIMARY KEY (SCHED_NAME, TRIGGER_GROUP) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_FIRED_TRIGGERS ( + SCHED_NAME VARCHAR(120) NOT NULL, + ENTRY_ID VARCHAR(95) NOT NULL, + TRIGGER_NAME VARCHAR(190) NOT NULL, + TRIGGER_GROUP VARCHAR(190) NOT NULL, + INSTANCE_NAME VARCHAR(190) NOT NULL, + FIRED_TIME BIGINT(13) NOT NULL, + SCHED_TIME BIGINT(13) NOT NULL, + PRIORITY INTEGER NOT NULL, + STATE VARCHAR(16) NOT NULL, + JOB_NAME VARCHAR(190) NULL, + JOB_GROUP VARCHAR(190) NULL, + IS_NONCONCURRENT VARCHAR(1) NULL, + REQUESTS_RECOVERY VARCHAR(1) NULL, + PRIMARY KEY (SCHED_NAME, ENTRY_ID) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_SCHEDULER_STATE ( + SCHED_NAME VARCHAR(120) NOT NULL, + INSTANCE_NAME VARCHAR(190) NOT NULL, + LAST_CHECKIN_TIME BIGINT(13) NOT NULL, + CHECKIN_INTERVAL BIGINT(13) NOT NULL, + PRIMARY KEY (SCHED_NAME, INSTANCE_NAME) +) + ENGINE = InnoDB; + +CREATE TABLE QRTZ_LOCKS ( + SCHED_NAME VARCHAR(120) NOT NULL, + LOCK_NAME VARCHAR(40) NOT NULL, + PRIMARY KEY (SCHED_NAME, LOCK_NAME) +) + ENGINE = InnoDB; + +CREATE INDEX IDX_QRTZ_J_REQ_RECOVERY + ON QRTZ_JOB_DETAILS (SCHED_NAME, REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_J_GRP + ON QRTZ_JOB_DETAILS (SCHED_NAME, JOB_GROUP); + +CREATE INDEX IDX_QRTZ_T_J + ON QRTZ_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_JG + ON QRTZ_TRIGGERS (SCHED_NAME, JOB_GROUP); +CREATE INDEX IDX_QRTZ_T_C + ON QRTZ_TRIGGERS (SCHED_NAME, CALENDAR_NAME); +CREATE INDEX IDX_QRTZ_T_G + ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_T_STATE + ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_STATE + ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP, TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_N_G_STATE + ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_GROUP, TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NEXT_FIRE_TIME + ON QRTZ_TRIGGERS (SCHED_NAME, NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST + ON QRTZ_TRIGGERS (SCHED_NAME, TRIGGER_STATE, NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_MISFIRE + ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE + ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_STATE); +CREATE INDEX IDX_QRTZ_T_NFT_ST_MISFIRE_GRP + ON QRTZ_TRIGGERS (SCHED_NAME, MISFIRE_INSTR, NEXT_FIRE_TIME, TRIGGER_GROUP, TRIGGER_STATE); + +CREATE INDEX IDX_QRTZ_FT_TRIG_INST_NAME + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME); +CREATE INDEX IDX_QRTZ_FT_INST_JOB_REQ_RCVRY + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, INSTANCE_NAME, REQUESTS_RECOVERY); +CREATE INDEX IDX_QRTZ_FT_J_G + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_NAME, JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_JG + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, JOB_GROUP); +CREATE INDEX IDX_QRTZ_FT_T_G + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_NAME, TRIGGER_GROUP); +CREATE INDEX IDX_QRTZ_FT_TG + ON QRTZ_FIRED_TRIGGERS (SCHED_NAME, TRIGGER_GROUP); + +COMMIT; diff --git a/demo/src/main/java/com/example/demo/DemoApplication.java b/demo/src/main/java/com/example/demo/DemoApplication.java index b784344..511ab28 100644 --- a/demo/src/main/java/com/example/demo/DemoApplication.java +++ b/demo/src/main/java/com/example/demo/DemoApplication.java @@ -1,6 +1,9 @@ package com.example.demo; import org.mybatis.spring.annotation.MapperScan; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; @@ -8,9 +11,16 @@ @ComponentScan("com.example.demo") @MapperScan("com.example.demo.dao") @SpringBootApplication -public class DemoApplication { +public class DemoApplication implements CommandLineRunner { + + private static final Logger logger = LoggerFactory.getLogger(DemoApplication.class); public static void main(String[] args) { SpringApplication.run(DemoApplication.class, args); } + + @Override + public void run(String... strings) throws Exception { + logger.info("Application is success, Index >> http://127.0.0.1:8080/JobManager.html"); + } } diff --git a/demo/src/main/java/com/example/demo/controller/JobController.java b/demo/src/main/java/com/example/demo/controller/JobController.java index 519d012..61e01bc 100644 --- a/demo/src/main/java/com/example/demo/controller/JobController.java +++ b/demo/src/main/java/com/example/demo/controller/JobController.java @@ -1,8 +1,9 @@ package com.example.demo.controller; -import java.util.HashMap; -import java.util.Map; - +import com.example.demo.entity.JobAndTrigger; +import com.example.demo.job.BaseJob; +import com.example.demo.service.IJobAndTriggerService; +import com.github.pagehelper.PageInfo; import org.quartz.CronScheduleBuilder; import org.quartz.CronTrigger; import org.quartz.JobBuilder; @@ -22,93 +23,107 @@ import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; -import com.example.demo.entity.JobAndTrigger; -import com.example.demo.job.BaseJob; -import com.example.demo.service.IJobAndTriggerService; -import com.github.pagehelper.PageInfo; +import java.util.HashMap; +import java.util.Map; @RestController -@RequestMapping(value="/job") -public class JobController -{ +@RequestMapping(value = "/job") +public class JobController { @Autowired private IJobAndTriggerService iJobAndTriggerService; - + //加入Qulifier注解,通过名称注入bean - @Autowired @Qualifier("Scheduler") + @Autowired + @Qualifier("Scheduler") private Scheduler scheduler; - - private static Logger log = LoggerFactory.getLogger(JobController.class); - - - @PostMapping(value="/addjob") - public void addjob(@RequestParam(value="jobClassName")String jobClassName, - @RequestParam(value="jobGroupName")String jobGroupName, - @RequestParam(value="cronExpression")String cronExpression) throws Exception - { - addJob(jobClassName, jobGroupName, cronExpression); - } - - public void addJob(String jobClassName, String jobGroupName, String cronExpression)throws Exception{ - - // 启动调度器 - scheduler.start(); - + + private static Logger log = LoggerFactory.getLogger(JobController.class); + + /** + * 添加 job + * + * @param jobClassName + * @param jobGroupName + * @param cronExpression + * @throws Exception + */ + @PostMapping(value = "/addjob") + public void addjob(@RequestParam(value = "jobClassName") String jobClassName, + @RequestParam(value = "jobGroupName") String jobGroupName, + @RequestParam(value = "cronExpression") String cronExpression) throws Exception { + // 启动调度器 + scheduler.start(); + //构建job信息 JobDetail jobDetail = JobBuilder.newJob(getClass(jobClassName).getClass()).withIdentity(jobClassName, jobGroupName).build(); - + //表达式调度构建器(即任务执行的时间) - CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); - - //按新的cronExpression表达式构建一个新的trigger - CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName) - .withSchedule(scheduleBuilder).build(); - - try { - scheduler.scheduleJob(jobDetail, trigger); - - } catch (SchedulerException e) { - System.out.println("创建定时任务失败"+e); - throw new Exception("创建定时任务失败"); - } - } + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule(cronExpression); + //按新的cronExpression表达式构建一个新的trigger + CronTrigger trigger = TriggerBuilder.newTrigger().withIdentity(jobClassName, jobGroupName) + .withSchedule(scheduleBuilder).build(); - @PostMapping(value="/pausejob") - public void pausejob(@RequestParam(value="jobClassName")String jobClassName, @RequestParam(value="jobGroupName")String jobGroupName) throws Exception - { - jobPause(jobClassName, jobGroupName); + try { + scheduler.scheduleJob(jobDetail, trigger); + + } catch (SchedulerException e) { + System.out.println("创建定时任务失败" + e); + throw new Exception("创建定时任务失败"); + } } - - public void jobPause(String jobClassName, String jobGroupName) throws Exception - { + + + /** + * 暂停 job + * + * @param jobClassName + * @param jobGroupName + * @throws Exception + */ + @PostMapping(value = "/pausejob") + public void pausejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { scheduler.pauseJob(JobKey.jobKey(jobClassName, jobGroupName)); } - - @PostMapping(value="/resumejob") - public void resumejob(@RequestParam(value="jobClassName")String jobClassName, @RequestParam(value="jobGroupName")String jobGroupName) throws Exception - { - jobresume(jobClassName, jobGroupName); - } - - public void jobresume(String jobClassName, String jobGroupName) throws Exception - { + + /** + * 恢复 job + * + * @param jobClassName + * @param jobGroupName + * @throws Exception + */ + @PostMapping(value = "/resumejob") + public void resumejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { scheduler.resumeJob(JobKey.jobKey(jobClassName, jobGroupName)); } - - - @PostMapping(value="/reschedulejob") - public void rescheduleJob(@RequestParam(value="jobClassName")String jobClassName, - @RequestParam(value="jobGroupName")String jobGroupName, - @RequestParam(value="cronExpression")String cronExpression) throws Exception - { - jobreschedule(jobClassName, jobGroupName, cronExpression); + + /** + * 立即执行一次 job + * + * @param jobClassName + * @param jobGroupName + * @throws Exception + */ + @PostMapping(value = "/executeOnceJob") + public void executeOnceJob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { + scheduler.triggerJob(JobKey.jobKey(jobClassName, jobGroupName)); } - - public void jobreschedule(String jobClassName, String jobGroupName, String cronExpression) throws Exception - { + + /** + * 重新设置表达式 + * + * @param jobClassName + * @param jobGroupName + * @param cronExpression + * @throws Exception + */ + @PostMapping(value = "/reschedulejob") + public void rescheduleJob(@RequestParam(value = "jobClassName") String jobClassName, + @RequestParam(value = "jobGroupName") String jobGroupName, + @RequestParam(value = "cronExpression") String cronExpression) throws Exception { try { TriggerKey triggerKey = TriggerKey.triggerKey(jobClassName, jobGroupName); // 表达式调度构建器 @@ -122,41 +137,45 @@ public void jobreschedule(String jobClassName, String jobGroupName, String cronE // 按新的trigger重新设置job执行 scheduler.rescheduleJob(triggerKey, trigger); } catch (SchedulerException e) { - System.out.println("更新定时任务失败"+e); + System.out.println("更新定时任务失败" + e); throw new Exception("更新定时任务失败"); } } - - - @PostMapping(value="/deletejob") - public void deletejob(@RequestParam(value="jobClassName")String jobClassName, @RequestParam(value="jobGroupName")String jobGroupName) throws Exception - { - jobdelete(jobClassName, jobGroupName); - } - - public void jobdelete(String jobClassName, String jobGroupName) throws Exception - { + + /** + * 删除 job + * + * @param jobClassName + * @param jobGroupName + * @throws Exception + */ + @PostMapping(value = "/deletejob") + public void deletejob(@RequestParam(value = "jobClassName") String jobClassName, @RequestParam(value = "jobGroupName") String jobGroupName) throws Exception { scheduler.pauseTrigger(TriggerKey.triggerKey(jobClassName, jobGroupName)); scheduler.unscheduleJob(TriggerKey.triggerKey(jobClassName, jobGroupName)); - scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName)); + scheduler.deleteJob(JobKey.jobKey(jobClassName, jobGroupName)); } - - - @GetMapping(value="/queryjob") - public Map queryjob(@RequestParam(value="pageNum")Integer pageNum, @RequestParam(value="pageSize")Integer pageSize) - { + + /** + * 查询 job 列表 + * + * @param pageNum + * @param pageSize + * @return + */ + @GetMapping(value = "/queryjob") + public Map queryjob(@RequestParam(value = "pageNum") Integer pageNum, @RequestParam(value = "pageSize") Integer pageSize) { PageInfo jobAndTrigger = iJobAndTriggerService.getJobAndTriggerDetails(pageNum, pageSize); - Map map = new HashMap(); + Map map = new HashMap<>(); map.put("JobAndTrigger", jobAndTrigger); map.put("number", jobAndTrigger.getTotal()); return map; } - - public static BaseJob getClass(String classname) throws Exception - { + + public static BaseJob getClass(String classname) throws Exception { Class class1 = Class.forName(classname); - return (BaseJob)class1.newInstance(); + return (BaseJob) class1.newInstance(); } - - + + } diff --git a/demo/src/main/java/com/example/demo/dao/JobAndTriggerMapper.java b/demo/src/main/java/com/example/demo/dao/JobAndTriggerMapper.java index 889207b..ff3d5bf 100644 --- a/demo/src/main/java/com/example/demo/dao/JobAndTriggerMapper.java +++ b/demo/src/main/java/com/example/demo/dao/JobAndTriggerMapper.java @@ -1,9 +1,9 @@ package com.example.demo.dao; -import java.util.List; - import com.example.demo.entity.JobAndTrigger; +import java.util.List; + public interface JobAndTriggerMapper { - public List getJobAndTriggerDetails(); + List getJobAndTriggerDetails(); } diff --git a/demo/src/main/java/com/example/demo/job/BaseJob.java b/demo/src/main/java/com/example/demo/job/BaseJob.java index 43a7975..d98c2bd 100644 --- a/demo/src/main/java/com/example/demo/job/BaseJob.java +++ b/demo/src/main/java/com/example/demo/job/BaseJob.java @@ -1,10 +1,19 @@ package com.example.demo.job; +import org.quartz.DisallowConcurrentExecution; import org.quartz.Job; import org.quartz.JobExecutionContext; import org.quartz.JobExecutionException; +/** + * @DisallowConcurrentExecution 注解的作用: + * 此标记用在实现Job的类上面,意思是不允许并发执行,按照我之前的理解是 不允许调度框架在同一时刻调用Job类,后来经过测试发现并不是这样,而是Job(任务)的执行时间[比如需要10秒]大于任务的时间间隔[Interval(5秒)], + * 那么默认情况下,调度框架为了能让 任务按照我们预定的时间间隔执行,会马上启用新的线程执行任务。否则的话会等待任务执行完毕以后 再重新执行!(这样会导致任务的执行不是按照我们预先定义的时间间隔执行) + * 设置 @DisallowConcurrentExecution 以后程序会等任务执行完毕以后再去执行,这样就不会再启用新的线程执行 + * 资料:http://www.cnblogs.com/daxin/archive/2013/05/27/3101972.html + */ +@DisallowConcurrentExecution public interface BaseJob extends Job{ - public void execute(JobExecutionContext context) throws JobExecutionException; + void execute(JobExecutionContext context) throws JobExecutionException; } diff --git a/demo/src/main/java/com/example/demo/job/HelloJob.java b/demo/src/main/java/com/example/demo/job/HelloJob.java index 018dec4..c7a90ee 100644 --- a/demo/src/main/java/com/example/demo/job/HelloJob.java +++ b/demo/src/main/java/com/example/demo/job/HelloJob.java @@ -1,22 +1,21 @@ package com.example.demo.job; -import java.util.Date; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component public class HelloJob implements BaseJob { - private static Logger _log = LoggerFactory.getLogger(HelloJob.class); - - public HelloJob() { - - } - - public void execute(JobExecutionContext context) - throws JobExecutionException { - _log.error("Hello Job执行时间: " + new Date()); + private static Logger log = LoggerFactory.getLogger(HelloJob.class); + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + log.info("Hello Job执行时间: " + new Date()); } } diff --git a/demo/src/main/java/com/example/demo/job/NewJob.java b/demo/src/main/java/com/example/demo/job/NewJob.java index 1241c3b..4482d8b 100644 --- a/demo/src/main/java/com/example/demo/job/NewJob.java +++ b/demo/src/main/java/com/example/demo/job/NewJob.java @@ -1,22 +1,25 @@ package com.example.demo.job; -import java.util.Date; -import org.slf4j.Logger; -import org.slf4j.LoggerFactory; -import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; - -public class NewJob implements BaseJob { - - private static Logger _log = LoggerFactory.getLogger(NewJob.class); - - public NewJob() { - - } - - public void execute(JobExecutionContext context) - throws JobExecutionException { - _log.error("New Job执行时间: " + new Date()); - - } +import org.quartz.JobExecutionContext; +import org.quartz.JobExecutionException; +import org.slf4j.Logger; +import org.slf4j.LoggerFactory; +import org.springframework.stereotype.Component; + +import java.util.Date; + +@Component +public class NewJob implements BaseJob { + + private static Logger log = LoggerFactory.getLogger(NewJob.class); + + public NewJob() { + + } + + @Override + public void execute(JobExecutionContext context) throws JobExecutionException { + log.info("New Job执行时间: " + new Date()); + + } } \ No newline at end of file diff --git a/demo/src/main/java/com/example/demo/service/IJobAndTriggerService.java b/demo/src/main/java/com/example/demo/service/IJobAndTriggerService.java index 8270808..359e239 100644 --- a/demo/src/main/java/com/example/demo/service/IJobAndTriggerService.java +++ b/demo/src/main/java/com/example/demo/service/IJobAndTriggerService.java @@ -5,5 +5,5 @@ import com.github.pagehelper.PageInfo; public interface IJobAndTriggerService { - public PageInfo getJobAndTriggerDetails(int pageNum, int pageSize); + PageInfo getJobAndTriggerDetails(int pageNum, int pageSize); } diff --git a/demo/src/main/java/com/example/demo/service/impl/JobAndTriggerImpl.java b/demo/src/main/java/com/example/demo/service/impl/JobAndTriggerImpl.java index 54ddc71..0fbe685 100644 --- a/demo/src/main/java/com/example/demo/service/impl/JobAndTriggerImpl.java +++ b/demo/src/main/java/com/example/demo/service/impl/JobAndTriggerImpl.java @@ -18,6 +18,7 @@ public class JobAndTriggerImpl implements IJobAndTriggerService{ @Autowired private JobAndTriggerMapper jobAndTriggerMapper; + @Override public PageInfo getJobAndTriggerDetails(int pageNum, int pageSize) { PageHelper.startPage(pageNum, pageSize); List list = jobAndTriggerMapper.getJobAndTriggerDetails(); diff --git a/demo/src/main/resources/application.yml b/demo/src/main/resources/application.yml index 58735ba..67c5b9d 100644 --- a/demo/src/main/resources/application.yml +++ b/demo/src/main/resources/application.yml @@ -1,12 +1,11 @@ spring: datasource: - url: jdbc:mysql://190.0.1.88:3306/hello_test?useUnicode=true + url: jdbc:mysql://127.0.0.1:3306/springboot_quartz_jdbc?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&characterSetResults=UTF-8&autoReconnect=true&allowMultiQueries=true&useSSL=false username: root - password: root + password: 123456 driver-class-name: com.mysql.jdbc.Driver mybatis: mapper-locations: - - classpath:com/example/demo/mapper/*.xml + - classpath:mapper/*.xml type-aliases-package: com.example.demo.entity - \ No newline at end of file diff --git a/demo/src/main/java/com/example/demo/mapper/JobMapper.xml b/demo/src/main/resources/mapper/JobMapper.xml similarity index 100% rename from demo/src/main/java/com/example/demo/mapper/JobMapper.xml rename to demo/src/main/resources/mapper/JobMapper.xml diff --git a/demo/src/main/resources/quartz.properties b/demo/src/main/resources/quartz.properties index 9fc7aa6..20aec8c 100644 --- a/demo/src/main/resources/quartz.properties +++ b/demo/src/main/resources/quartz.properties @@ -1,5 +1,5 @@ -# 固定前缀org.quartz -# 主要分为scheduler、threadPool、jobStore、plugin等部分 +# \u56FA\u5B9A\u524D\u7F00org.quartz +# \u4E3B\u8981\u5206\u4E3Ascheduler\u3001threadPool\u3001jobStore\u3001plugin\u7B49\u90E8\u5206 # # org.quartz.scheduler.instanceName = DefaultQuartzScheduler @@ -7,22 +7,22 @@ org.quartz.scheduler.rmi.export = false org.quartz.scheduler.rmi.proxy = false org.quartz.scheduler.wrapJobExecutionInUserTransaction = false -# 实例化ThreadPool时,使用的线程类为SimpleThreadPool +# \u5B9E\u4F8B\u5316ThreadPool\u65F6\uFF0C\u4F7F\u7528\u7684\u7EBF\u7A0B\u7C7B\u4E3ASimpleThreadPool org.quartz.threadPool.class = org.quartz.simpl.SimpleThreadPool -# threadCount和threadPriority将以setter的形式注入ThreadPool实例 -# 并发个数 -org.quartz.threadPool.threadCount = 5 -# 优先级 +# threadCount\u548CthreadPriority\u5C06\u4EE5setter\u7684\u5F62\u5F0F\u6CE8\u5165ThreadPool\u5B9E\u4F8B +# \u5E76\u53D1\u4E2A\u6570 +org.quartz.threadPool.threadCount = 10 +# \u4F18\u5148\u7EA7 org.quartz.threadPool.threadPriority = 5 org.quartz.threadPool.threadsInheritContextClassLoaderOfInitializingThread = true org.quartz.jobStore.misfireThreshold = 5000 -# 默认存储在内存中 +# \u9ED8\u8BA4\u5B58\u50A8\u5728\u5185\u5B58\u4E2D #org.quartz.jobStore.class = org.quartz.simpl.RAMJobStore -#持久化 +#\u6301\u4E45\u5316 org.quartz.jobStore.class = org.quartz.impl.jdbcjobstore.JobStoreTX org.quartz.jobStore.tablePrefix = QRTZ_ @@ -31,10 +31,10 @@ org.quartz.jobStore.dataSource = qzDS org.quartz.dataSource.qzDS.driver = com.mysql.jdbc.Driver -org.quartz.dataSource.qzDS.URL = jdbc:mysql://190.0.1.88:3306/hello_test?useUnicode=true&characterEncoding=UTF-8 +org.quartz.dataSource.qzDS.URL = jdbc:mysql://127.0.0.1:3306/springboot_quartz_jdbc?rewriteBatchedStatements=true&useUnicode=true&characterEncoding=utf-8&characterSetResults=UTF-8&autoReconnect=true&allowMultiQueries=true&useSSL=false org.quartz.dataSource.qzDS.user = root -org.quartz.dataSource.qzDS.password = root +org.quartz.dataSource.qzDS.password = 123456 org.quartz.dataSource.qzDS.maxConnections = 10 \ No newline at end of file diff --git a/demo/src/main/resources/static/JobManager.html b/demo/src/main/resources/static/JobManager.html index a920fc6..9094b3e 100644 --- a/demo/src/main/resources/static/JobManager.html +++ b/demo/src/main/resources/static/JobManager.html @@ -91,6 +91,11 @@ type="info" @click="handleResume(scope.$index, scope.row)">恢复 + 立即执行一次 +