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