diff --git a/lab-28/lab-28-task-quartz-jdbc/pom.xml b/lab-28/lab-28-task-quartz-jdbc/pom.xml index 794bd75c..b80ae87e 100644 --- a/lab-28/lab-28-task-quartz-jdbc/pom.xml +++ b/lab-28/lab-28-task-quartz-jdbc/pom.xml @@ -35,6 +35,13 @@ org.springframework.boot spring-boot-starter-quartz + + + + org.springframework.boot + spring-boot-starter-test + test + diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/Application02.java b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/Application02.java new file mode 100644 index 00000000..ff98e7a0 --- /dev/null +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/Application02.java @@ -0,0 +1,17 @@ +package cn.iocoder.springboot.lab28.task; + +import org.springframework.boot.SpringApplication; +import org.springframework.boot.autoconfigure.SpringBootApplication; + +@SpringBootApplication +public class Application02 { + + public static void main(String[] args) { + // 设置 Tomcat 随机端口 + System.setProperty("server.port", "0"); + + // 启动 Spring Boot 应用 + SpringApplication.run(Application.class, args); + } + +} diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/DataSourceConfiguration.java b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/DataSourceConfiguration.java index fc8cbe46..c74d94c4 100644 --- a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/DataSourceConfiguration.java +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/DataSourceConfiguration.java @@ -2,6 +2,7 @@ package cn.iocoder.springboot.lab28.task.config; import com.zaxxer.hikari.HikariDataSource; import org.springframework.boot.autoconfigure.jdbc.DataSourceProperties; +import org.springframework.boot.autoconfigure.quartz.QuartzDataSource; import org.springframework.boot.context.properties.ConfigurationProperties; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; @@ -26,6 +27,7 @@ public class DataSourceConfiguration { /** * 创建 user 数据源 */ + @Primary @Bean(name = "userDataSource") @ConfigurationProperties(prefix = "spring.datasource.user.hikari") // 读取 spring.datasource.user 配置到 HikariDataSource 对象 public DataSource userDataSource() { @@ -49,6 +51,7 @@ public class DataSourceConfiguration { */ @Bean(name = "quartzDataSource") @ConfigurationProperties(prefix = "spring.datasource.quartz.hikari") + @QuartzDataSource public DataSource quartzDataSource() { // 获得 DataSourceProperties 对象 DataSourceProperties properties = this.quartzDataSourceProperties(); diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java index 2ed05370..68b85288 100644 --- a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Configuration; @Configuration public class ScheduleConfiguration { - @Configuration public static class DemoJob01Configuration { @Bean @@ -36,7 +35,6 @@ public class ScheduleConfiguration { } - @Configuration public static class DemoJob02Configuration { @Bean diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob01.java b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob01.java index 5691d7d6..92263b7d 100644 --- a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob01.java +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob01.java @@ -1,28 +1,24 @@ package cn.iocoder.springboot.lab28.task.job; import cn.iocoder.springboot.lab28.task.service.DemoService; +import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.quartz.QuartzJobBean; -import java.util.concurrent.atomic.AtomicInteger; - +@DisallowConcurrentExecution public class DemoJob01 extends QuartzJobBean { private Logger logger = LoggerFactory.getLogger(getClass()); - private final AtomicInteger counts = new AtomicInteger(); - @Autowired private DemoService demoService; @Override - protected void executeInternal(JobExecutionContext context) throws JobExecutionException { - logger.info("[executeInternal][定时第 ({}) 次执行, demoService 为 ({})]", counts.incrementAndGet(), - demoService); + protected void executeInternal(JobExecutionContext context) { + logger.info("[executeInternal][我开始的执行了, demoService 为 ({})]", demoService); } } diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob02.java b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob02.java index c4cdbf9c..4f721424 100644 --- a/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob02.java +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/java/cn/iocoder/springboot/lab28/task/job/DemoJob02.java @@ -1,17 +1,18 @@ package cn.iocoder.springboot.lab28.task.job; +import org.quartz.DisallowConcurrentExecution; import org.quartz.JobExecutionContext; -import org.quartz.JobExecutionException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.scheduling.quartz.QuartzJobBean; +@DisallowConcurrentExecution public class DemoJob02 extends QuartzJobBean { private Logger logger = LoggerFactory.getLogger(getClass()); @Override - protected void executeInternal(JobExecutionContext context) throws JobExecutionException { + protected void executeInternal(JobExecutionContext context) { logger.info("[executeInternal][我开始的执行了]"); } diff --git a/lab-28/lab-28-task-quartz-jdbc/src/main/resources/application.yaml b/lab-28/lab-28-task-quartz-jdbc/src/main/resources/application.yaml index f3b64151..02ce2539 100644 --- a/lab-28/lab-28-task-quartz-jdbc/src/main/resources/application.yaml +++ b/lab-28/lab-28-task-quartz-jdbc/src/main/resources/application.yaml @@ -22,9 +22,20 @@ spring: properties: # 添加 Quartz Scheduler 附加属性,更多可以看 http://www.quartz-scheduler.org/documentation/2.4.0-SNAPSHOT/configuration.html 文档 org: quartz: + # JobStore 相关配置 + jobStore: + # 数据源名称 + dataSource: quartzDataSource # 使用的数据源 + class: org.quartz.impl.jdbcjobstore.JobStoreTX # JobStore 实现类 + driverDelegateClass: org.quartz.impl.jdbcjobstore.StdJDBCDelegate + tablePrefix: QRTZ_ # Quartz 表前缀 + isClustered: true # 是集群模式 + clusterCheckinInterval: 1000 + useProperties: false + # 线程池相关配置 threadPool: threadCount: 25 # 线程池大小。默认为 10 。 threadPriority: 5 # 线程优先级 class: org.quartz.simpl.SimpleThreadPool # 线程池类型 jdbc: # 使用 JDBC 的 JobStore 的时候,JDBC 的配置 - initialize-schema: never # TODO + initialize-schema: never # 是否自动使用 SQL 初始化 Quartz 表结构。这里设置成 never ,我们手动创建表结构。 diff --git a/lab-28/lab-28-task-quartz-jdbc/src/test/java/cn/iocoder/springboot/lab28/task/QuartzSchedulerTest.java b/lab-28/lab-28-task-quartz-jdbc/src/test/java/cn/iocoder/springboot/lab28/task/QuartzSchedulerTest.java new file mode 100644 index 00000000..4a0cfa16 --- /dev/null +++ b/lab-28/lab-28-task-quartz-jdbc/src/test/java/cn/iocoder/springboot/lab28/task/QuartzSchedulerTest.java @@ -0,0 +1,58 @@ +package cn.iocoder.springboot.lab28.task; + +import cn.iocoder.springboot.lab28.task.job.DemoJob01; +import cn.iocoder.springboot.lab28.task.job.DemoJob02; +import org.junit.Test; +import org.junit.runner.RunWith; +import org.quartz.*; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.test.context.SpringBootTest; +import org.springframework.test.context.junit4.SpringRunner; + +@RunWith(SpringRunner.class) +@SpringBootTest(classes = Application.class) +public class QuartzSchedulerTest { + + @Autowired + private Scheduler scheduler; + + @Test + public void addDemoJob01Config() throws SchedulerException { + // 创建 JobDetail + JobDetail jobDetail = JobBuilder.newJob(DemoJob01.class) + .withIdentity("demoJob01") // 名字为 demoJob01 + .storeDurably() // 没有 Trigger 关联的时候任务是否被保留。因为创建 JobDetail 时,还没 Trigger 指向它,所以需要设置为 true ,表示保留。 + .build(); + // 创建 Trigger + SimpleScheduleBuilder scheduleBuilder = SimpleScheduleBuilder.simpleSchedule() + .withIntervalInSeconds(5) // 频率。 + .repeatForever(); // 次数。 + Trigger trigger = TriggerBuilder.newTrigger() + .forJob(jobDetail) // 对应 Job 为 demoJob01 + .withIdentity("demoJob01Trigger") // 名字为 demoJob01Trigger + .withSchedule(scheduleBuilder) // 对应 Schedule 为 scheduleBuilder + .build(); + // 添加调度任务 + scheduler.scheduleJob(jobDetail, trigger); + } + + @Test + public void addDemoJob02Config() throws SchedulerException { + // 创建 JobDetail + JobDetail jobDetail = JobBuilder.newJob(DemoJob02.class) + .withIdentity("demoJob02") // 名字为 demoJob02 + .storeDurably() // 没有 Trigger 关联的时候任务是否被保留。因为创建 JobDetail 时,还没 Trigger 指向它,所以需要设置为 true ,表示保留。 + .build(); + // 创建 Trigger + CronScheduleBuilder scheduleBuilder = CronScheduleBuilder.cronSchedule("0/10 * * * * ? *"); + Trigger trigger = TriggerBuilder.newTrigger() + .forJob(jobDetail) // 对应 Job 为 demoJob01 + .withIdentity("demoJob02Trigger") // 名字为 demoJob01Trigger + .withSchedule(scheduleBuilder) // 对应 Schedule 为 scheduleBuilder + .build(); + // 添加调度任务 + scheduler.scheduleJob(jobDetail, trigger); +// scheduler.scheduleJob(jobDetail, Sets.newSet(trigger), true); + } + +} diff --git a/lab-28/lab-28-task-quartz-memory/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java b/lab-28/lab-28-task-quartz-memory/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java index 85db231e..7217c752 100644 --- a/lab-28/lab-28-task-quartz-memory/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java +++ b/lab-28/lab-28-task-quartz-memory/src/main/java/cn/iocoder/springboot/lab28/task/config/ScheduleConfiguration.java @@ -9,7 +9,6 @@ import org.springframework.context.annotation.Configuration; @Configuration public class ScheduleConfiguration { - @Configuration public static class DemoJob01Configuration { @Bean @@ -36,7 +35,6 @@ public class ScheduleConfiguration { } - @Configuration public static class DemoJob02Configuration { @Bean diff --git a/lab-28/lab-28-task-xxl-job/pom.xml b/lab-28/lab-28-task-xxl-job/pom.xml new file mode 100644 index 00000000..a5fed1bc --- /dev/null +++ b/lab-28/lab-28-task-xxl-job/pom.xml @@ -0,0 +1,15 @@ + + + + lab-28 + cn.iocoder.springboot.labs + 1.0-SNAPSHOT + + 4.0.0 + + lab-28-task-xxl-job + + + diff --git a/lab-28/pom.xml b/lab-28/pom.xml index 4c919a77..03a7721f 100644 --- a/lab-28/pom.xml +++ b/lab-28/pom.xml @@ -15,6 +15,7 @@ lab-28-task-demo lab-28-task-quartz-memory lab-28-task-quartz-jdbc + lab-28-task-xxl-job