diff --git a/SpringBoot-Redis-Jedis/.gitignore b/SpringBoot-Redis-Jedis/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/SpringBoot-Redis-Jedis/README.MD b/SpringBoot-Redis-Jedis/README.MD
new file mode 100644
index 0000000000000000000000000000000000000000..6365e7cc1dd3a3acb102dcf92b98d76cd39e74b6
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/README.MD
@@ -0,0 +1,8 @@
+# 本案例实现SpringBoot整合redis(Jedis)
+接口访问地址如下:
+http://localhost:8080/getValue?key=123
+http://localhost:8080/setValue?key=123&value=5555
+
+Lettuce和Jedis的都是连接Redis Server的客户端程序。
+Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。
+Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
\ No newline at end of file
diff --git a/SpringBoot-Redis-Jedis/pom.xml b/SpringBoot-Redis-Jedis/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..204548b1d6d7789e2b8965ac262d088cf9b6800a
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/pom.xml
@@ -0,0 +1,67 @@
+
+ 4.0.0
+ com.button
+ SpringBoot-Redis-Jedis
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot集成redis(jedis)
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+ redis.clients
+ jedis
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/SpringBootRedisJedisApplication.java b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/SpringBootRedisJedisApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..66677467c6a6c3490eb0f3c2e45a4caab944b167
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/SpringBootRedisJedisApplication.java
@@ -0,0 +1,11 @@
+package com.button.boot.redis.jedis;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootRedisJedisApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootRedisJedisApplication.class, args);
+ }
+}
diff --git a/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/config/JedisConfigure.java b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/config/JedisConfigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..72123680a8f5f82580cc6ef4816901d60dc7bbcc
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/config/JedisConfigure.java
@@ -0,0 +1,65 @@
+package com.button.boot.redis.jedis.config;
+
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.data.redis.connection.RedisPassword;
+import org.springframework.data.redis.connection.RedisStandaloneConfiguration;
+import org.springframework.data.redis.connection.jedis.JedisClientConfiguration;
+import org.springframework.data.redis.connection.jedis.JedisConnectionFactory;
+import org.springframework.data.redis.core.StringRedisTemplate;
+
+import redis.clients.jedis.JedisPoolConfig;
+
+@Configuration
+public class JedisConfigure {
+ @Value("${spring.redis.host}")
+ private String host;
+ @Value("${spring.redis.port}")
+ private Integer port;
+ @Value("${spring.redis.password}")
+ private String password;
+
+ @Bean
+ public JedisPoolConfig getJedisPoolConfig(){
+ JedisPoolConfig jedisPoolConfig = new JedisPoolConfig();
+ //最大空闲连接数, 默认8个
+ jedisPoolConfig.setMaxIdle(4);
+ //最大连接数, 默认8个
+ jedisPoolConfig.setMaxTotal(8);
+ //最小空闲连接数, 默认0
+ jedisPoolConfig.setMinIdle(1);
+ //获取连接时的最大等待毫秒数(如果设置为阻塞时BlockWhenExhausted),如果超时就抛异常, 小于零:阻塞不确定的时间, 默认-1
+ jedisPoolConfig.setMaxWaitMillis(-1);
+ //逐出连接的最小空闲时间 默认1800000毫秒(30分钟)
+ jedisPoolConfig.setMinEvictableIdleTimeMillis(300000);
+ //每次逐出检查时 逐出的最大数目 如果为负数就是 : 1/abs(n), 默认3
+ jedisPoolConfig.setNumTestsPerEvictionRun(3);
+ //一个连接在池中最小生存的时间
+ jedisPoolConfig.setTimeBetweenEvictionRunsMillis(60000);
+ //连接超时时是否阻塞,false时报异常,ture阻塞直到超时, 默认true
+ jedisPoolConfig.setBlockWhenExhausted(true);
+ return jedisPoolConfig;
+ }
+
+ @Bean
+ public JedisConnectionFactory redisConnectionFactory(JedisPoolConfig jedisPoolConfig) {
+ RedisStandaloneConfiguration redisStandaloneConfiguration = new RedisStandaloneConfiguration();
+ redisStandaloneConfiguration.setHostName(host);
+ redisStandaloneConfiguration.setPort(port);
+ redisStandaloneConfiguration.setPassword(RedisPassword.of(password));
+ //jedisConnectionFactoryJ对于Standalone模式的没有(RedisStandaloneConfiguration,JedisPoolConfig)的构造函数,对此我们用JedisClientConfiguration接口的builder方法实例化一个构造器
+ JedisClientConfiguration.JedisPoolingClientConfigurationBuilder jpcf = (JedisClientConfiguration.JedisPoolingClientConfigurationBuilder) JedisClientConfiguration.builder();
+ //修改我们的连接池配置
+ jpcf.poolConfig(jedisPoolConfig);
+ //通过构造器来构造jedis客户端配置
+ JedisClientConfiguration jedisClientConfiguration = jpcf.build();
+ return new JedisConnectionFactory(redisStandaloneConfiguration, jedisClientConfiguration);
+ }
+
+ @Bean(name="stringRedisTemplate")
+ public StringRedisTemplate getRedisTemplate(@Qualifier("redisConnectionFactory") JedisConnectionFactory factory){
+ return new StringRedisTemplate(factory);
+ }
+}
diff --git a/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/controller/RedisController.java b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/controller/RedisController.java
new file mode 100644
index 0000000000000000000000000000000000000000..6041092b7186ffdb27b173ae0ef0789f1b061e49
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/controller/RedisController.java
@@ -0,0 +1,24 @@
+package com.button.boot.redis.jedis.controller;
+
+import java.util.concurrent.TimeUnit;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.button.boot.redis.jedis.service.RedisManager;
+
+@RestController
+public class RedisController {
+ @Autowired
+ private RedisManager redisManager;
+
+ @GetMapping("/getValue")
+ public String getValue(String key) {
+ return redisManager.valueGet(key);
+ }
+ @GetMapping("/setValue")
+ public void getValue(String key, String value) {
+ redisManager.valueSet(key, value, 10, TimeUnit.MINUTES);
+ }
+}
diff --git a/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/RedisManager.java b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/RedisManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..825fad992cba5fe44ba5ad6b149c93c818ac9f49
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/RedisManager.java
@@ -0,0 +1,8 @@
+package com.button.boot.redis.jedis.service;
+
+import java.util.concurrent.TimeUnit;
+
+public interface RedisManager {
+ public void valueSet(String key,String value,Integer timeout,TimeUnit timeUnit);
+ public String valueGet(String key);
+}
diff --git a/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/impl/RedisManagerImpl.java b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/impl/RedisManagerImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..05eb4bca68b24df7bee8e65ccf9a938b6b20f0c0
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/java/com/button/boot/redis/jedis/service/impl/RedisManagerImpl.java
@@ -0,0 +1,26 @@
+package com.button.boot.redis.jedis.service.impl;
+
+import java.util.concurrent.TimeUnit;
+
+import javax.annotation.Resource;
+
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import com.button.boot.redis.jedis.service.RedisManager;
+
+@Service
+public class RedisManagerImpl implements RedisManager {
+ @Resource(name="stringRedisTemplate")
+ private StringRedisTemplate strRedisTemplate;
+
+ @Override
+ public String valueGet(String key){
+ return strRedisTemplate.opsForValue().get(key);
+ }
+
+ @Override
+ public void valueSet(String key, String value, Integer timeout, TimeUnit timeUnit) {
+ strRedisTemplate.opsForValue().set(key, value, timeout, timeUnit);
+ }
+}
diff --git a/SpringBoot-Redis-Jedis/src/main/resources/application.yml b/SpringBoot-Redis-Jedis/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..f86f24889c7bd11a812fc03725502a9619cfeae2
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/resources/application.yml
@@ -0,0 +1,11 @@
+server:
+ port: 8080
+
+logging:
+ file: logback.xml
+
+spring:
+ redis:
+ host: ***.***.***.*** # Redis服务器地址
+ port: 6379 # Redis服务器连接端口
+ password: ********** # Redis服务器连接密码(默认为空)
diff --git a/SpringBoot-Redis-Jedis/src/main/resources/logback.xml b/SpringBoot-Redis-Jedis/src/main/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4ddc2dd06f20e09c85901d0126fe5016d9b76f9a
--- /dev/null
+++ b/SpringBoot-Redis-Jedis/src/main/resources/logback.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_button.log
+
+
+
+ ${LOG_HOME}/springboot_button.log.%d{yyyy-MM-dd}.%i.log
+
+
+
+ 100MB
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
diff --git a/SpringBoot-Redis-Lettuce/.gitignore b/SpringBoot-Redis-Lettuce/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/SpringBoot-Redis-Lettuce/README.MD b/SpringBoot-Redis-Lettuce/README.MD
new file mode 100644
index 0000000000000000000000000000000000000000..1e9fb2f61353ee4e9ec1c2eb1e39263cd7053bb9
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/README.MD
@@ -0,0 +1,6 @@
+# 本案例实现SpringBoot整合redis(Lettuce)
+接口访问地址如下:
+http://localhost:8080/getValue
+http://localhost:8080/getUser
+http://localhost:8080/getUserValue?key=123(测试缓存效果)
+Lettuce和Jedis的都是连接Redis Server的客户端程序。Jedis在实现上是直连redis server,多线程环境下非线程安全,除非使用连接池,为每个Jedis实例增加物理连接。Lettuce基于Netty的连接实例(StatefulRedisConnection),可以在多个线程间并发访问,且线程安全,满足多线程环境下的并发访问,同时它是可伸缩的设计,一个连接实例不够的情况也可以按需增加连接实例。
\ No newline at end of file
diff --git a/SpringBoot-Redis-Lettuce/pom.xml b/SpringBoot-Redis-Lettuce/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fe75e63312309a7817bf81b450292890e205408d
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/pom.xml
@@ -0,0 +1,70 @@
+
+ 4.0.0
+ com.button
+ SpringBoot-Redis-Lettuce
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot集成redis(Lettuce)
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+ org.springframework.boot
+ spring-boot-starter-data-redis
+
+
+
+ org.apache.commons
+ commons-pool2
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/SpringBootRedisLettuceApplication.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/SpringBootRedisLettuceApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..a17d4e56b90e70986fefebf3221e7ebd3d70f751
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/SpringBootRedisLettuceApplication.java
@@ -0,0 +1,11 @@
+package com.button.boot.redis.lettuce;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootRedisLettuceApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootRedisLettuceApplication.class, args);
+ }
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/config/RedisLettuceConfigure.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/config/RedisLettuceConfigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..c7c5400bb6860e2f930884e450eec609759a6b3a
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/config/RedisLettuceConfigure.java
@@ -0,0 +1,29 @@
+package com.button.boot.redis.lettuce.config;
+
+import java.lang.reflect.Method;
+
+import org.springframework.cache.annotation.CachingConfigurerSupport;
+import org.springframework.cache.annotation.EnableCaching;
+import org.springframework.cache.interceptor.KeyGenerator;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+@Configuration
+@EnableCaching
+public class RedisLettuceConfigure extends CachingConfigurerSupport {
+ @Bean
+ public KeyGenerator redisKeyGenerator() {
+ return new KeyGenerator() {
+ @Override
+ public Object generate(Object target, Method method, Object... params) {
+ StringBuilder sb = new StringBuilder();
+ sb.append(target.getClass().getName());
+ sb.append(method.getName());
+ for (Object obj : params) {
+ sb.append(obj.toString());
+ }
+ return sb.toString();
+ }
+ };
+ }
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/controller/UserController.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/controller/UserController.java
new file mode 100644
index 0000000000000000000000000000000000000000..d71a0326d377e5740be42a29f228cee80ab27e43
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/controller/UserController.java
@@ -0,0 +1,37 @@
+package com.button.boot.redis.lettuce.controller;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.cache.annotation.Cacheable;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import com.button.boot.redis.lettuce.model.UserModel;
+import com.button.boot.redis.lettuce.service.RedisManager;
+
+@RestController
+public class UserController {
+
+ @Autowired
+ private RedisManager redisManager;
+
+ @GetMapping("/getValue")
+ public String getValue() {
+ redisManager.setValue("123", "test");
+ return redisManager.getValue("123");
+ }
+
+ @GetMapping("/getUser")
+ public UserModel getUser() {
+ UserModel user = new UserModel();
+ user.setName("张三");
+ user.setAge(24);
+ redisManager.leftPush("user", user);
+ return redisManager.leftPop("user");
+ }
+
+ @GetMapping("/getUserValue")
+ @Cacheable(value="userKey") //将结果缓存,下一次重复请求时会直接返回结果
+ public String getUserValue(String key) {
+ return redisManager.getValue(key);
+ }
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/model/UserModel.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/model/UserModel.java
new file mode 100644
index 0000000000000000000000000000000000000000..bb831abc85b62af06071f7981089453c66f89530
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/model/UserModel.java
@@ -0,0 +1,27 @@
+package com.button.boot.redis.lettuce.model;
+
+import java.io.Serializable;
+
+public class UserModel implements Serializable {
+ private static final long serialVersionUID = 1L;
+
+ private String name;
+ private Integer age;
+
+ public String getName() {
+ return name;
+ }
+ public void setName(String name) {
+ this.name = name;
+ }
+ public Integer getAge() {
+ return age;
+ }
+ public void setAge(Integer age) {
+ this.age = age;
+ }
+ @Override
+ public String toString() {
+ return "UserModel [name=" + name + ", age=" + age + "]";
+ }
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/RedisManager.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/RedisManager.java
new file mode 100644
index 0000000000000000000000000000000000000000..601477ba34e7284f4e4f930172ea143910fa711c
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/RedisManager.java
@@ -0,0 +1,10 @@
+package com.button.boot.redis.lettuce.service;
+
+import com.button.boot.redis.lettuce.model.UserModel;
+
+public interface RedisManager {
+ public void setValue(String key, String value);
+ public String getValue(String key);
+ public void leftPush(String key, UserModel value);
+ public UserModel leftPop(String key);
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/impl/RedisManagerImpl.java b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/impl/RedisManagerImpl.java
new file mode 100644
index 0000000000000000000000000000000000000000..4b75f4caddb89e43899ee8550d1f415dafb9765f
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/java/com/button/boot/redis/lettuce/service/impl/RedisManagerImpl.java
@@ -0,0 +1,37 @@
+package com.button.boot.redis.lettuce.service.impl;
+
+import javax.annotation.Resource;
+
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.redis.core.RedisTemplate;
+import org.springframework.data.redis.core.StringRedisTemplate;
+import org.springframework.stereotype.Service;
+
+import com.button.boot.redis.lettuce.model.UserModel;
+import com.button.boot.redis.lettuce.service.RedisManager;
+
+@Service
+public class RedisManagerImpl implements RedisManager {
+ @Autowired
+ private StringRedisTemplate stringRedisTemplate;
+ @Resource //此处使用@Autowired会注入异常(https://blog.csdn.net/zhaoheng314/article/details/81564166)
+ private RedisTemplate redisTemplate;
+
+ @Override
+ public void setValue(String key, String value) {
+
+ stringRedisTemplate.opsForValue().set(key, value);
+ }
+ @Override
+ public String getValue(String key) {
+ return stringRedisTemplate.opsForValue().get(key);
+ }
+ @Override
+ public void leftPush(String key, UserModel value) {
+ redisTemplate.opsForList().leftPush(key, value);
+ }
+ @Override
+ public UserModel leftPop(String key) {
+ return redisTemplate.opsForList().leftPop(key);
+ }
+}
diff --git a/SpringBoot-Redis-Lettuce/src/main/resources/application.yml b/SpringBoot-Redis-Lettuce/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..65e7a0a26a8e9e88a62bede4b632f041dcb5a9a1
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/resources/application.yml
@@ -0,0 +1,19 @@
+server:
+ port: 8080
+
+logging:
+ file: logback.xml
+
+spring:
+ redis:
+ database: 0 # Redis数据库索引(默认为0)
+ host: ***.***.***.*** # Redis服务器地址
+ port: 6379 # Redis服务器连接端口
+ password: ********** # Redis服务器连接密码(默认为空)
+ timeout: 10000 # 连接超时时间(毫秒)
+ lettuce:
+ pool:
+ max-active: 8 # 连接池最大连接数(使用负值表示没有限制) 默认 8
+ max-wait: -1 # 连接池最大阻塞等待时间(使用负值表示没有限制) 默认 -1
+ max-idle: 8 # 连接池中的最大空闲连接 默认 8
+ min-idle: 0 # 连接池中的最小空闲连接 默认 0
\ No newline at end of file
diff --git a/SpringBoot-Redis-Lettuce/src/main/resources/logback.xml b/SpringBoot-Redis-Lettuce/src/main/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4ddc2dd06f20e09c85901d0126fe5016d9b76f9a
--- /dev/null
+++ b/SpringBoot-Redis-Lettuce/src/main/resources/logback.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_button.log
+
+
+
+ ${LOG_HOME}/springboot_button.log.%d{yyyy-MM-dd}.%i.log
+
+
+
+ 100MB
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
diff --git a/Springboot-Quartz-Cluster/.gitignore b/Springboot-Quartz-Cluster/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d
--- /dev/null
+++ b/Springboot-Quartz-Cluster/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/Springboot-Quartz-Cluster/README.MD b/Springboot-Quartz-Cluster/README.MD
new file mode 100644
index 0000000000000000000000000000000000000000..d5dc8c015cee17d0a439e81bcaf366649103fbb6
--- /dev/null
+++ b/Springboot-Quartz-Cluster/README.MD
@@ -0,0 +1,3 @@
+# 本案例实现SpringBoot整合quartz实现定时任务(集群版)
+cron表达式配置在application.yml文件中
+注:运行前需要执行quartz.sql
\ No newline at end of file
diff --git a/Springboot-Quartz-Cluster/pom.xml b/Springboot-Quartz-Cluster/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..f1e20ed0136deb3a01aff72aa6e75b545fa40d34
--- /dev/null
+++ b/Springboot-Quartz-Cluster/pom.xml
@@ -0,0 +1,93 @@
+
+ 4.0.0
+ com.button
+ Springboot-Quartz-Cluster
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot集成quartz(集群)
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+ mysql
+ mysql-connector-java
+
+
+ org.springframework.boot
+ spring-boot-starter-jdbc
+
+
+ org.apache.tomcat
+ tomcat-jdbc
+
+
+
+
+ com.zaxxer
+ HikariCP-java7
+ 2.4.13
+
+
+
+ org.quartz-scheduler
+ quartz
+
+
+ org.quartz-scheduler
+ quartz-jobs
+
+
+ org.springframework
+ spring-context-support
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Quartz-Cluster/quartz.sql b/Springboot-Quartz-Cluster/quartz.sql
new file mode 100644
index 0000000000000000000000000000000000000000..c96348def32530462c00bf4f486f27ed8fcfaecc
--- /dev/null
+++ b/Springboot-Quartz-Cluster/quartz.sql
@@ -0,0 +1,174 @@
+CREATE DATABASE springboot_quartz;
+USE springboot_quartz;
+
+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(200) NOT NULL,
+JOB_GROUP VARCHAR(200) 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(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+JOB_NAME VARCHAR(200) NOT NULL,
+JOB_GROUP VARCHAR(200) 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(200) 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(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL,
+ TRIGGER_GROUP VARCHAR(200) 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(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) 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(200) 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(200) 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(200) NOT NULL,
+TRIGGER_GROUP VARCHAR(200) NOT NULL,
+INSTANCE_NAME VARCHAR(200) 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(200) NULL,
+JOB_GROUP VARCHAR(200) 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(200) 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/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/SpringBootQuartzClusterApplication.java b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/SpringBootQuartzClusterApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..c73d4b62c3c6bf038dfd7005ac3496d92b9c088a
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/SpringBootQuartzClusterApplication.java
@@ -0,0 +1,11 @@
+package com.button.boot.quartz.cluster;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootQuartzClusterApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootQuartzClusterApplication.class, args);
+ }
+}
diff --git a/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/AutoWiredSpringBeanToJobFactory.java b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/AutoWiredSpringBeanToJobFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..87da337d94a0f1e5597e7565f3b74091bbf0ad08
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/AutoWiredSpringBeanToJobFactory.java
@@ -0,0 +1,23 @@
+package com.button.boot.quartz.cluster.config;
+
+import org.quartz.spi.TriggerFiredBundle;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.ApplicationContextAware;
+import org.springframework.scheduling.quartz.SpringBeanJobFactory;
+
+public class AutoWiredSpringBeanToJobFactory extends SpringBeanJobFactory implements ApplicationContextAware {
+ private transient AutowireCapableBeanFactory beanFactory;
+
+ @Override
+ public void setApplicationContext(final ApplicationContext context) {
+ beanFactory = context.getAutowireCapableBeanFactory();
+ }
+
+ @Override
+ protected Object createJobInstance(final TriggerFiredBundle bundle) throws Exception {
+ final Object job = super.createJobInstance(bundle);
+ beanFactory.autowireBean(job);
+ return job;
+ }
+}
diff --git a/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/QuartzClusterConfigure.java b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/QuartzClusterConfigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..909ec7571d8210bd4019831dd13a65db4ac2a724
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/config/QuartzClusterConfigure.java
@@ -0,0 +1,111 @@
+package com.button.boot.quartz.cluster.config;
+
+import java.io.IOException;
+import java.util.Properties;
+
+import javax.sql.DataSource;
+
+import org.quartz.JobDetail;
+import org.quartz.Trigger;
+import org.quartz.spi.JobFactory;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.annotation.Qualifier;
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.beans.factory.config.PropertiesFactoryBean;
+import org.springframework.context.ApplicationContext;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.core.io.ClassPathResource;
+import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
+import org.springframework.scheduling.quartz.JobDetailFactoryBean;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+
+import com.button.boot.quartz.cluster.timertask.QuartzTaskJob;
+
+@Configuration
+public class QuartzClusterConfigure {
+ // 配置文件路径
+ private static final String QUARTZ_CONFIG = "/quartz.properties";
+
+ @Autowired
+ @Qualifier(value = "dataSource")
+ private DataSource dataSource;
+
+ @Value("${quartz.cronExpression}")
+ private String cronExpression;
+
+ /**
+ * 从quartz.properties文件中读取Quartz配置属性
+ * @return
+ * @throws IOException
+ */
+ @Bean
+ public Properties quartzProperties() throws IOException {
+ PropertiesFactoryBean propertiesFactoryBean = new PropertiesFactoryBean();
+ propertiesFactoryBean.setLocation(new ClassPathResource(QUARTZ_CONFIG));
+ propertiesFactoryBean.afterPropertiesSet();
+ return propertiesFactoryBean.getObject();
+ }
+
+ /**
+ * JobFactory与schedulerFactoryBean中的JobFactory相互依赖,注意bean的名称
+ * 在这里为JobFactory注入了Spring上下文
+ *
+ * @param applicationContext
+ * @return
+ */
+ @Bean
+ public JobFactory buttonJobFactory(ApplicationContext applicationContext) {
+ AutoWiredSpringBeanToJobFactory jobFactory = new AutoWiredSpringBeanToJobFactory();
+ jobFactory.setApplicationContext(applicationContext);
+ return jobFactory;
+ }
+
+ /**
+ *
+ * @param buttonJobFactory 为SchedulerFactory配置JobFactory
+ * @param cronJobTrigger
+ * @return
+ * @throws IOException
+ */
+ @Bean
+ public SchedulerFactoryBean schedulerFactoryBean(JobFactory buttonJobFactory, Trigger... cronJobTrigger) throws IOException {
+ SchedulerFactoryBean factory = new SchedulerFactoryBean();
+ factory.setJobFactory(buttonJobFactory);
+ factory.setOverwriteExistingJobs(true);
+ factory.setAutoStartup(true); // 设置自行启动
+ factory.setQuartzProperties(quartzProperties());
+ factory.setTriggers(cronJobTrigger);
+ factory.setDataSource(dataSource);// 使用应用的dataSource替换quartz的dataSource
+ return factory;
+ }
+
+ /**
+ * 配置JobDetailFactory
+ * JobDetailFactoryBean与CronTriggerFactoryBean相互依赖,注意bean的名称
+ *
+ * @return
+ */
+ @Bean
+ public JobDetailFactoryBean buttonobDetail() {
+ //集群模式下必须使用JobDetailFactoryBean,MethodInvokingJobDetailFactoryBean 类中的 methodInvoking 方法,是不支持序列化的
+ JobDetailFactoryBean jobDetail = new JobDetailFactoryBean();
+ jobDetail.setDurability(true);
+ jobDetail.setRequestsRecovery(true);
+ jobDetail.setJobClass(QuartzTaskJob.class);
+ return jobDetail;
+ }
+ /**
+ * 配置具体执行规则
+ * @param buttonobDetail
+ * @return
+ */
+ @Bean
+ public CronTriggerFactoryBean cronJobTrigger(JobDetail buttonobDetail) {
+ CronTriggerFactoryBean tigger = new CronTriggerFactoryBean();
+ tigger.setJobDetail(buttonobDetail);
+ tigger.setStartDelay(2000); //延迟启动
+ tigger.setCronExpression(cronExpression); //从application.yml文件读取
+ return tigger;
+ }
+}
diff --git a/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/timertask/QuartzTaskJob.java b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/timertask/QuartzTaskJob.java
new file mode 100644
index 0000000000000000000000000000000000000000..6f2ca6ca1578c07ab204ab7f0db186c4d6e8609a
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/java/com/button/boot/quartz/cluster/timertask/QuartzTaskJob.java
@@ -0,0 +1,32 @@
+package com.button.boot.quartz.cluster.timertask;
+
+import org.quartz.DisallowConcurrentExecution;
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.quartz.PersistJobDataAfterExecution;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.stereotype.Component;
+
+/**
+ * @DisallowConcurrentExecution : 此标记用在实现Job的类上面,意思是不允许并发执行.
+ * 注org.quartz.threadPool.threadCount的数量有多个的情况,@DisallowConcurrentExecution才生效
+ */
+@Component
+@PersistJobDataAfterExecution
+@DisallowConcurrentExecution
+public class QuartzTaskJob implements Job {
+ private static final Logger logger = LoggerFactory.getLogger(QuartzTaskJob.class);
+
+ /**
+ * 核心方法,Quartz Job真正的执行逻辑.
+ * @param JobExecutionContext中封装有Quartz运行所需要的所有信息
+ * @throws JobExecutionException execute()方法只允许抛出JobExecutionException异常
+ */
+ @Override
+ public void execute(JobExecutionContext context) throws JobExecutionException {
+ logger.info("--------------定时任务时间到了---------------------");
+ logger.info("--------------定时任务执行逻辑---------------------");
+ }
+}
diff --git a/Springboot-Quartz-Cluster/src/main/resources/application.yml b/Springboot-Quartz-Cluster/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..74833fb02f9cadb0ae535fa7786795dfff6c67d3
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/resources/application.yml
@@ -0,0 +1,25 @@
+server:
+ port: 8080
+
+logging:
+ file: logback.xml
+
+spring:
+ dataSource:
+ url: jdbc:mysql://localhost:3306/springboot_quartz?characterEncoding=utf-8&autoReconnect=true&allowMultiQueries=true&useSSL=false&zeroDateTimeBehavior=convertToNull
+ username: root
+ password: 211314
+ driver-class-name: com.mysql.jdbc.Driver
+ type: com.zaxxer.hikari.HikariDataSource
+ hikari:
+ minimum-idle: 5
+ maximum-pool-size: 15
+ idle-timeout: 30000
+ pool-name: DatebookHikariCP
+ max-lifetime: 1800000
+ connection-timeout: 30000
+ connection-test-query: 'SELECT 1'
+# Path does not chain with any of the trust anchors
+# 在windows上是MySql5.5没有问题,5.8出现异常把useSSL=true改为useSSL=false就好了。
+quartz:
+ cronExpression: 0 0/1 * * * ?
\ No newline at end of file
diff --git a/Springboot-Quartz-Cluster/src/main/resources/logback.xml b/Springboot-Quartz-Cluster/src/main/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..e2c2483438584ae46858125f438fca5a741461c5
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/resources/logback.xml
@@ -0,0 +1,33 @@
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_button.log
+
+
+
+ ${LOG_HOME}/springboot_button.log.%d{yyyy-MM-dd}.%i.log
+
+
+
+ 100MB
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
diff --git a/Springboot-Quartz-Cluster/src/main/resources/quartz.properties b/Springboot-Quartz-Cluster/src/main/resources/quartz.properties
new file mode 100644
index 0000000000000000000000000000000000000000..e060dff86026a4b1f536e84328fb6e0c728b1e41
--- /dev/null
+++ b/Springboot-Quartz-Cluster/src/main/resources/quartz.properties
@@ -0,0 +1,24 @@
+#quartz集群配置
+#调度标识名 集群中每一个实例都必须使用相同的名称
+org.quartz.scheduler.instanceName=DefaultQuartzScheduler
+#ID设置为自动获取 每一个必须不同
+org.quartz.scheduler.instanceId=AUTO
+org.quartz.scheduler.makeSchedulerThreadDaemon=true
+#线程池的实现类(一般使用SimpleThreadPool即可满足需求)
+org.quartz.threadPool.class=org.quartz.simpl.SimpleThreadPool
+#指定在线程池里面创建的线程是否是守护线程
+org.quartz.threadPool.makeThreadsDaemons=true
+#指定线程数,至少为1(无默认值)
+org.quartz.threadPool.threadCount:20
+#设置线程的优先级(最大为java.lang.Thread.MAX_PRIORITY 10,最小为Thread.MIN_PRIORITY 1,默认为5)
+org.quartz.threadPool.threadPriority:5
+#数据保存方式为数据库持久化
+org.quartz.jobStore.class=org.quartz.impl.jdbcjobstore.JobStoreTX
+#数据库代理类,一般org.quartz.impl.jdbcjobstore.StdJDBCDelegate可以满足大部分数据库
+org.quartz.jobStore.driverDelegateClass=org.quartz.impl.jdbcjobstore.StdJDBCDelegate
+#表的前缀,默认QRTZ_
+org.quartz.jobStore.tablePrefix=QRTZ_
+#是否加入集群
+org.quartz.jobStore.isClustered=true
+# 信息保存时间 默认值60秒
+org.quartz.jobStore.misfireThreshold=25000
\ No newline at end of file
diff --git a/Springboot-Quartz-StandAlone/.gitignore b/Springboot-Quartz-StandAlone/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/Springboot-Quartz-StandAlone/README.MD b/Springboot-Quartz-StandAlone/README.MD
new file mode 100644
index 0000000000000000000000000000000000000000..1b3eb006117e25d7a0a7dfacd3f7168a4cf09c0d
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/README.MD
@@ -0,0 +1,2 @@
+# 本案例实现SpringBoot整合quartz实现定时任务(单机版)
+cron表达式配置在application.yml文件中
\ No newline at end of file
diff --git a/Springboot-Quartz-StandAlone/pom.xml b/Springboot-Quartz-StandAlone/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..af7451abe5c9d38b5059d0954a5a4456723f80c3
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/pom.xml
@@ -0,0 +1,73 @@
+
+ 4.0.0
+ com.button
+ Springboot-Quartz-StandAlone
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot集成quartz(单机)
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.5.RELEASE
+
+
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter
+
+
+ org.springframework.boot
+ spring-boot-configuration-processor
+ true
+
+
+
+ org.quartz-scheduler
+ quartz
+
+
+ org.springframework
+ spring-context-support
+
+
+ org.springframework
+ spring-tx
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/SpringBootAQuartzAloneApplication.java b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/SpringBootAQuartzAloneApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..6c57720b9177e965055053fb0a091b88b967bac3
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/SpringBootAQuartzAloneApplication.java
@@ -0,0 +1,13 @@
+package com.button.boot.quartz.alone;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+import org.springframework.scheduling.annotation.EnableScheduling;
+
+@SpringBootApplication
+@EnableScheduling
+public class SpringBootAQuartzAloneApplication {
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootAQuartzAloneApplication.class, args);
+ }
+}
diff --git a/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/MyAdaptableJobFactory.java b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/MyAdaptableJobFactory.java
new file mode 100644
index 0000000000000000000000000000000000000000..24f24ba06148a56166dbcc5cc9063385f8b21a30
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/MyAdaptableJobFactory.java
@@ -0,0 +1,19 @@
+package com.button.boot.quartz.alone.config;
+
+import org.quartz.spi.TriggerFiredBundle;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.beans.factory.config.AutowireCapableBeanFactory;
+import org.springframework.scheduling.quartz.AdaptableJobFactory;
+import org.springframework.stereotype.Component;
+
+@Component("myAdaptableJobFactory")
+public class MyAdaptableJobFactory extends AdaptableJobFactory {
+ @Autowired
+ private AutowireCapableBeanFactory autowireCapableBeanFactory;
+
+ protected Object createJobInstance(TriggerFiredBundle bundle) throws Exception {
+ Object object = super.createJobInstance(bundle);
+ this.autowireCapableBeanFactory.autowireBean(object);
+ return object;
+ }
+}
diff --git a/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/QuartzAloneConfigure.java b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/QuartzAloneConfigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..2701aa991afab8d13b80474c0c7157ea7f1a7db3
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/config/QuartzAloneConfigure.java
@@ -0,0 +1,43 @@
+package com.button.boot.quartz.alone.config;
+
+import org.springframework.beans.factory.annotation.Value;
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+import org.springframework.scheduling.quartz.CronTriggerFactoryBean;
+import org.springframework.scheduling.quartz.JobDetailFactoryBean;
+import org.springframework.scheduling.quartz.SchedulerFactoryBean;
+
+import com.button.boot.quartz.alone.timertask.QuartzTaskJob;
+
+@Configuration
+public class QuartzAloneConfigure {
+
+ @Value("${quartz.cronExpression}")
+ private String cronExpression;
+
+ // 创建Job对象
+ @Bean
+ public JobDetailFactoryBean jobDetailFactoryBean() {
+ JobDetailFactoryBean factory = new JobDetailFactoryBean();
+ factory.setJobClass(QuartzTaskJob.class);
+ return factory;
+ }
+
+ // 创建Trigger对象
+ @Bean
+ public CronTriggerFactoryBean cronTriggerFactoryBean(JobDetailFactoryBean jobDetailFactoryBean) {
+ CronTriggerFactoryBean factory = new CronTriggerFactoryBean();
+ factory.setJobDetail(jobDetailFactoryBean.getObject());
+ factory.setCronExpression(cronExpression);
+ return factory;
+ }
+
+ // 创建Scheduler对象
+ @Bean
+ public SchedulerFactoryBean schedulerFactoryBean(CronTriggerFactoryBean cronTriggerFactoryBean, MyAdaptableJobFactory myAdaptableFactory) {
+ SchedulerFactoryBean factory = new SchedulerFactoryBean();
+ factory.setTriggers(cronTriggerFactoryBean.getObject());
+ factory.setJobFactory(myAdaptableFactory);
+ return factory;
+ }
+}
diff --git a/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/timertask/QuartzTaskJob.java b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/timertask/QuartzTaskJob.java
new file mode 100644
index 0000000000000000000000000000000000000000..6370594581d351347a93d0acd4bc14aca23418fc
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/java/com/button/boot/quartz/alone/timertask/QuartzTaskJob.java
@@ -0,0 +1,18 @@
+package com.button.boot.quartz.alone.timertask;
+
+import org.quartz.Job;
+import org.quartz.JobExecutionContext;
+import org.quartz.JobExecutionException;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+public class QuartzTaskJob implements Job {
+ private static final Logger logger = LoggerFactory.getLogger(QuartzTaskJob.class);
+
+ @Override
+ public void execute(JobExecutionContext context) throws JobExecutionException {
+ logger.info("--------------定时任务时间到了---------------------");
+ logger.info("--------------定时任务执行逻辑---------------------");
+ }
+
+}
diff --git a/Springboot-Quartz-StandAlone/src/main/resources/application.yml b/Springboot-Quartz-StandAlone/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2b09e48396ea8790be1c84df7fa9972902c91a79
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/resources/application.yml
@@ -0,0 +1,8 @@
+server:
+ port: 8080
+
+logging:
+ file: logback.xml
+
+quartz:
+ cronExpression: 0 0/1 * * * ?
\ No newline at end of file
diff --git a/Springboot-Quartz-StandAlone/src/main/resources/logback.xml b/Springboot-Quartz-StandAlone/src/main/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..4ddc2dd06f20e09c85901d0126fe5016d9b76f9a
--- /dev/null
+++ b/Springboot-Quartz-StandAlone/src/main/resources/logback.xml
@@ -0,0 +1,34 @@
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+ ${LOG_HOME}/springboot_button.log
+
+
+
+ ${LOG_HOME}/springboot_button.log.%d{yyyy-MM-dd}.%i.log
+
+
+
+ 100MB
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
diff --git a/Springboot-Swagger/.gitignore b/Springboot-Swagger/.gitignore
new file mode 100644
index 0000000000000000000000000000000000000000..b83d22266ac8aa2f8df2edef68082c789727841d
--- /dev/null
+++ b/Springboot-Swagger/.gitignore
@@ -0,0 +1 @@
+/target/
diff --git a/Springboot-Swagger/README.MD b/Springboot-Swagger/README.MD
new file mode 100644
index 0000000000000000000000000000000000000000..0cf5c89239053c2adbc8f530b932e85a385c1ace
--- /dev/null
+++ b/Springboot-Swagger/README.MD
@@ -0,0 +1,3 @@
+# 本案例主要实现SpringBoot整合Swagger
+项目访问地址如下:
+http://localhost:8080/swagger/swagger-ui.html
\ No newline at end of file
diff --git a/Springboot-Swagger/pom.xml b/Springboot-Swagger/pom.xml
new file mode 100644
index 0000000000000000000000000000000000000000..98f8a455f789e8247db6586fb05d67f8726018c1
--- /dev/null
+++ b/Springboot-Swagger/pom.xml
@@ -0,0 +1,67 @@
+
+ 4.0.0
+ com.button
+ Springboot-Swagger
+ 0.0.1-SNAPSHOT
+ jar
+
+ springboot整合swagger
+
+
+ UTF-8
+ UTF-8
+ 1.8
+
+
+ org.springframework.boot
+ spring-boot-starter-parent
+ 2.0.1.RELEASE
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-web
+
+
+
+
+ io.springfox
+ springfox-swagger2
+ 2.7.0
+
+
+ io.springfox
+ springfox-swagger-ui
+ 2.7.0
+
+
+
+
+ org.springframework.boot
+ spring-boot-starter-test
+ test
+
+
+ org.springframework.boot
+ spring-boot-devtools
+ true
+ true
+
+
+
+
+
+ org.springframework.boot
+ spring-boot-maven-plugin
+
+ -Dfile.encoding=UTF-8
+ true
+
+
+
+
+
\ No newline at end of file
diff --git a/Springboot-Swagger/src/main/java/com/button/boot/swagger/SpringBootSawggerApplication.java b/Springboot-Swagger/src/main/java/com/button/boot/swagger/SpringBootSawggerApplication.java
new file mode 100644
index 0000000000000000000000000000000000000000..71892f0f0b14d0e3b1af127c6e623024b96a506c
--- /dev/null
+++ b/Springboot-Swagger/src/main/java/com/button/boot/swagger/SpringBootSawggerApplication.java
@@ -0,0 +1,12 @@
+package com.button.boot.swagger;
+
+import org.springframework.boot.SpringApplication;
+import org.springframework.boot.autoconfigure.SpringBootApplication;
+
+@SpringBootApplication
+public class SpringBootSawggerApplication {
+ // 项目启动入口
+ public static void main(String[] args) {
+ SpringApplication.run(SpringBootSawggerApplication.class, args);
+ }
+}
diff --git a/Springboot-Swagger/src/main/java/com/button/boot/swagger/configure/SwaggerConfigure.java b/Springboot-Swagger/src/main/java/com/button/boot/swagger/configure/SwaggerConfigure.java
new file mode 100644
index 0000000000000000000000000000000000000000..3af7cc41f90c5356005e5468b2f3b723baa4d342
--- /dev/null
+++ b/Springboot-Swagger/src/main/java/com/button/boot/swagger/configure/SwaggerConfigure.java
@@ -0,0 +1,31 @@
+package com.button.boot.swagger.configure;
+
+import org.springframework.context.annotation.Bean;
+import org.springframework.context.annotation.Configuration;
+
+import springfox.documentation.builders.ApiInfoBuilder;
+import springfox.documentation.builders.PathSelectors;
+import springfox.documentation.builders.RequestHandlerSelectors;
+import springfox.documentation.service.ApiInfo;
+import springfox.documentation.spi.DocumentationType;
+import springfox.documentation.spring.web.plugins.Docket;
+import springfox.documentation.swagger2.annotations.EnableSwagger2;
+
+@Configuration
+@EnableSwagger2
+public class SwaggerConfigure {
+ @Bean
+ public Docket createRestApiButton() {
+ return new Docket(DocumentationType.SWAGGER_2).groupName("SwaggerTest").apiInfo(apiInfo())
+ .select().apis(RequestHandlerSelectors.basePackage("com.button.boot.swagger.controller")) //指定要扫描的包
+ .paths(PathSelectors.any()).build();
+ }
+ private ApiInfo apiInfo() {
+ return new ApiInfoBuilder()
+ .title("Swagger开发测试文档")
+ .description("SpringBoot整合Swagger")
+ .termsOfServiceUrl("http://www.baidu.com")
+ .version("1.0")
+ .build();
+ }
+}
diff --git a/Springboot-Swagger/src/main/java/com/button/boot/swagger/controller/SwaggerController.java b/Springboot-Swagger/src/main/java/com/button/boot/swagger/controller/SwaggerController.java
new file mode 100644
index 0000000000000000000000000000000000000000..17bcea5a0ff0ef4e2e8ef328d298b0e3caeb4a65
--- /dev/null
+++ b/Springboot-Swagger/src/main/java/com/button/boot/swagger/controller/SwaggerController.java
@@ -0,0 +1,33 @@
+package com.button.boot.swagger.controller;
+
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PostMapping;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RequestParam;
+import org.springframework.web.bind.annotation.RestController;
+
+import io.swagger.annotations.Api;
+import io.swagger.annotations.ApiOperation;
+
+@Api("swagger相关的api")
+@RestController
+@RequestMapping(value = "/sw")
+public class SwaggerController {
+ private static final Logger LOGGER = LoggerFactory.getLogger(SwaggerController.class);
+
+ @ApiOperation(value = "swaggerDemoController", notes = "接口测试")
+ @GetMapping(path = "/testInfo")
+ public String testInfo() {
+ LOGGER.info("开始发布续保查询消息");
+ return "你好";
+ }
+
+ @PostMapping(path = "/getId")
+ @ApiOperation(value = "获取id")
+ public String getClcz(@RequestParam(value = "id", required = false) String id) {
+ return id;
+ }
+
+}
diff --git a/Springboot-Swagger/src/main/resources/application.yml b/Springboot-Swagger/src/main/resources/application.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1639b829cb97fd4a678965eb89319642f49e9264
--- /dev/null
+++ b/Springboot-Swagger/src/main/resources/application.yml
@@ -0,0 +1,9 @@
+server:
+ servlet:
+ context-path: /swagger
+ port: 8080
+ uri-encoding: utf-8
+
+logging:
+ file: logback.xml
+
\ No newline at end of file
diff --git a/Springboot-Swagger/src/main/resources/logback.xml b/Springboot-Swagger/src/main/resources/logback.xml
new file mode 100644
index 0000000000000000000000000000000000000000..fb91b6902ec009e5c3b8914c92d74b7c1b9aac97
--- /dev/null
+++ b/Springboot-Swagger/src/main/resources/logback.xml
@@ -0,0 +1,37 @@
+
+
+
+
+
+
+
+
+ %d{yyyy-MM-dd HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+ ${LOG_HOME}/springboot_monitor.log
+
+
+
+ ${LOG_HOME}/springboot_swagger.log.%d{yyyy-MM-dd}.%i.log
+
+
+
+ 100MB
+
+
+
+
+ %d{HH:mm:ss.SSS} [%thread] %-5level %logger{50} -%msg%n
+
+
+
+
+
+
+
+
+
\ No newline at end of file