diff --git a/pom.xml b/pom.xml index ca03792..7af7a6c 100644 --- a/pom.xml +++ b/pom.xml @@ -162,6 +162,12 @@ runtime + + org.postgresql + postgresql + runtime + + com.alibaba druid-spring-boot-starter @@ -203,20 +209,27 @@ org.springframework.boot spring-boot-starter-data-redis - + io.netty netty-all - + + org.redisson + redisson-spring-data-21 + 3.11.0 + + + org.redisson + redisson + 3.11.0 + - + cn.hutool hutool-all 5.8.16 diff --git a/src/main/java/com/senmesh/frame/redis/config/RedisConfig.java b/src/main/java/com/senmesh/frame/redis/config/RedisConfig.java index fa69388..ec34604 100644 --- a/src/main/java/com/senmesh/frame/redis/config/RedisConfig.java +++ b/src/main/java/com/senmesh/frame/redis/config/RedisConfig.java @@ -45,10 +45,6 @@ public class RedisConfig { redisTemplate.afterPropertiesSet(); return redisTemplate; } - - @Bean - public RedissonUtils redissonUtils(RedissonClient redissonClient) { - return new RedissonUtils(redissonClient); - } + } diff --git a/src/main/java/com/senmesh/frame/redis/redisson/RedissonConfig.java b/src/main/java/com/senmesh/frame/redis/redisson/RedissonConfig.java index 3ea4113..8670dd2 100644 --- a/src/main/java/com/senmesh/frame/redis/redisson/RedissonConfig.java +++ b/src/main/java/com/senmesh/frame/redis/redisson/RedissonConfig.java @@ -1,158 +1,158 @@ -//package com.newyetai.frame.redis.redisson; -// -//import com.newyetai.frame.redis.property.RedissonProperties; -//import java.lang.reflect.Method; -//import java.util.ArrayList; -//import java.util.Arrays; -//import java.util.List; -// -//import org.apache.commons.lang3.StringUtils; -//import org.redisson.Redisson; -//import org.redisson.api.RedissonClient; -//import org.redisson.config.Config; +package com.senmesh.frame.redis.redisson; + +import com.senmesh.frame.redis.property.RedissonProperties; +import java.lang.reflect.Method; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; + +import org.apache.commons.lang3.StringUtils; +import org.redisson.Redisson; +import org.redisson.api.RedissonClient; +import org.redisson.config.Config; +import org.redisson.spring.data.connection.RedissonConnectionFactory; //import org.redisson.spring.data.connection.RedissonConnectionFactory; -////import org.redisson.spring.data.connection.RedissonConnectionFactory; -//import org.springframework.beans.factory.annotation.Autowired; -//import org.springframework.boot.autoconfigure.AutoConfigureAfter; -//import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; -//import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; -//import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; -//import org.springframework.boot.autoconfigure.data.redis.RedisProperties; -//import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel; -//import org.springframework.boot.context.properties.EnableConfigurationProperties; -//import org.springframework.context.annotation.Bean; -//import org.springframework.context.annotation.Configuration; -//import org.springframework.context.annotation.Import; -//import org.springframework.data.redis.connection.RedisConnectionFactory; -//import org.springframework.data.redis.core.RedisOperations; -//import org.springframework.data.redis.core.RedisTemplate; -//import org.springframework.data.redis.core.StringRedisTemplate; -//import org.springframework.util.ReflectionUtils; -// -///** -// * 参考redisson-spring-boot-starter的RedissonAutoConfiguration,沿用redis配置,移除自定义配置文件解析配置 -// * -// * @author sr on 2020-05-26 -// */ -//@Configuration -//@ConditionalOnClass({Redisson.class, RedisOperations.class}) -//@AutoConfigureAfter({RedisAutoConfiguration.class}) -//@EnableConfigurationProperties({RedisProperties.class, RedissonProperties.class}) -//@Import({RedisAutoConfiguration.class}) -//public class RedissonConfig { -// -// @Autowired -// private RedisProperties redisProperties; -// -// @Autowired -// private RedissonProperties redissonProperties; -// -// @Bean -// @ConditionalOnMissingBean(name = "redisTemplate") -// public RedisTemplate redisTemplate( -// RedisConnectionFactory redisConnectionFactory) { -// RedisTemplate template = new RedisTemplate(); -// template.setConnectionFactory(redisConnectionFactory); -// return template; -// } -// -// @Bean -// @ConditionalOnMissingBean(StringRedisTemplate.class) -// public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { -// StringRedisTemplate template = new StringRedisTemplate(); -// template.setConnectionFactory(redisConnectionFactory); -// return template; -// } -// -// @Bean -// @ConditionalOnMissingBean(RedisConnectionFactory.class) -// public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) { -// return new RedissonConnectionFactory(redisson); -// } -// -// @SuppressWarnings("unchecked") -// @Bean(destroyMethod = "shutdown") -// @ConditionalOnMissingBean(RedissonClient.class) -// public RedissonClient redisson() { -// Config config = null; -// Method clusterMethod = ReflectionUtils.findMethod(RedisProperties.class, "getCluster"); -// Method timeoutMethod = ReflectionUtils.findMethod(RedisProperties.class, "getTimeout"); -// Object timeoutValue = ReflectionUtils.invokeMethod(timeoutMethod, redisProperties); -// int timeout; -// if (null == timeoutValue) { -// timeout = 0; -// } else if (!(timeoutValue instanceof Integer)) { -// Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis"); -// timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue(); -// } else { -// timeout = (Integer) timeoutValue; -// } -// -// // 修复不设置密码,传入空字符串,置为空 -// String password = redisProperties.getPassword(); -// password = StringUtils.isBlank(password) ? null : password; -// if (redisProperties.getSentinel() != null) { -// Method nodesMethod = ReflectionUtils.findMethod(Sentinel.class, "getNodes"); -// Object nodesValue = ReflectionUtils.invokeMethod(nodesMethod, redisProperties.getSentinel()); -// -// String[] nodes; -// if (nodesValue instanceof String) { -// nodes = convert(Arrays.asList(((String) nodesValue).split(","))); -// } else { -// nodes = convert((List) nodesValue); -// } -// -// config = new Config(); -// config.useSentinelServers() -// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) -// .setMasterName(redisProperties.getSentinel().getMaster()) -// .addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase()) -// .setConnectTimeout(timeout).setPassword(password); -// } else if (clusterMethod != null -// && ReflectionUtils.invokeMethod(clusterMethod, redisProperties) != null) { -// Object clusterObject = ReflectionUtils.invokeMethod(clusterMethod, redisProperties); -// Method nodesMethod = ReflectionUtils.findMethod(clusterObject.getClass(), "getNodes"); -// List nodesObject = (List) ReflectionUtils.invokeMethod(nodesMethod, clusterObject); -// -// String[] nodes = convert(nodesObject); -// -// config = new Config(); -// config.useClusterServers() -// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) -// .addNodeAddress(nodes).setConnectTimeout(timeout) -// .setPassword(password); -// } else { -// config = new Config(); -// String prefix = "redis://"; -// Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl"); -// if (method != null && (Boolean) ReflectionUtils.invokeMethod(method, redisProperties)) { -// prefix = "rediss://"; -// } -// -// config.useSingleServer() -// .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) -// .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) -// .setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase()) -// .setPassword(password); -// } -// return Redisson.create(config); -// } -// -// private String[] convert(List nodesObject) { -// List nodes = new ArrayList(nodesObject.size()); -// for (String node : nodesObject) { -// if (!node.startsWith("redis://") && !node.startsWith("rediss://")) { -// nodes.add("redis://" + node); -// } else { -// nodes.add(node); -// } -// } -// return nodes.toArray(new String[nodes.size()]); -// } -// -// @Bean -// public RedissonUtils redissonUtils() { -// return new RedissonUtils(redisson()); -// } -// -//} +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.boot.autoconfigure.AutoConfigureAfter; +import org.springframework.boot.autoconfigure.condition.ConditionalOnClass; +import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.boot.autoconfigure.data.redis.RedisAutoConfiguration; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties; +import org.springframework.boot.autoconfigure.data.redis.RedisProperties.Sentinel; +import org.springframework.boot.context.properties.EnableConfigurationProperties; +import org.springframework.context.annotation.Bean; +import org.springframework.context.annotation.Configuration; +import org.springframework.context.annotation.Import; +import org.springframework.data.redis.connection.RedisConnectionFactory; +import org.springframework.data.redis.core.RedisOperations; +import org.springframework.data.redis.core.RedisTemplate; +import org.springframework.data.redis.core.StringRedisTemplate; +import org.springframework.util.ReflectionUtils; + +/** + * 参考redisson-spring-boot-starter的RedissonAutoConfiguration,沿用redis配置,移除自定义配置文件解析配置 + * + * @author sr on 2020-05-26 + */ +@Configuration +@ConditionalOnClass({Redisson.class, RedisOperations.class}) +@AutoConfigureAfter({RedisAutoConfiguration.class}) +@EnableConfigurationProperties({RedisProperties.class, RedissonProperties.class}) +@Import({RedisAutoConfiguration.class}) +public class RedissonConfig { + + @Autowired + private RedisProperties redisProperties; + + @Autowired + private RedissonProperties redissonProperties; + + @Bean + @ConditionalOnMissingBean(name = "redisTemplate") + public RedisTemplate redisTemplate( + RedisConnectionFactory redisConnectionFactory) { + RedisTemplate template = new RedisTemplate(); + template.setConnectionFactory(redisConnectionFactory); + return template; + } + + @Bean + @ConditionalOnMissingBean(StringRedisTemplate.class) + public StringRedisTemplate stringRedisTemplate(RedisConnectionFactory redisConnectionFactory) { + StringRedisTemplate template = new StringRedisTemplate(); + template.setConnectionFactory(redisConnectionFactory); + return template; + } + + @Bean + @ConditionalOnMissingBean(RedisConnectionFactory.class) + public RedissonConnectionFactory redissonConnectionFactory(RedissonClient redisson) { + return new RedissonConnectionFactory(redisson); + } + + @SuppressWarnings("unchecked") + @Bean(destroyMethod = "shutdown") + @ConditionalOnMissingBean(RedissonClient.class) + public RedissonClient redisson() { + Config config = null; + Method clusterMethod = ReflectionUtils.findMethod(RedisProperties.class, "getCluster"); + Method timeoutMethod = ReflectionUtils.findMethod(RedisProperties.class, "getTimeout"); + Object timeoutValue = ReflectionUtils.invokeMethod(timeoutMethod, redisProperties); + int timeout; + if (null == timeoutValue) { + timeout = 0; + } else if (!(timeoutValue instanceof Integer)) { + Method millisMethod = ReflectionUtils.findMethod(timeoutValue.getClass(), "toMillis"); + timeout = ((Long) ReflectionUtils.invokeMethod(millisMethod, timeoutValue)).intValue(); + } else { + timeout = (Integer) timeoutValue; + } + + // 修复不设置密码,传入空字符串,置为空 + String password = redisProperties.getPassword(); + password = StringUtils.isBlank(password) ? null : password; + if (redisProperties.getSentinel() != null) { + Method nodesMethod = ReflectionUtils.findMethod(Sentinel.class, "getNodes"); + Object nodesValue = ReflectionUtils.invokeMethod(nodesMethod, redisProperties.getSentinel()); + + String[] nodes; + if (nodesValue instanceof String) { + nodes = convert(Arrays.asList(((String) nodesValue).split(","))); + } else { + nodes = convert((List) nodesValue); + } + + config = new Config(); + config.useSentinelServers() + .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) + .setMasterName(redisProperties.getSentinel().getMaster()) + .addSentinelAddress(nodes).setDatabase(redisProperties.getDatabase()) + .setConnectTimeout(timeout).setPassword(password); + } else if (clusterMethod != null + && ReflectionUtils.invokeMethod(clusterMethod, redisProperties) != null) { + Object clusterObject = ReflectionUtils.invokeMethod(clusterMethod, redisProperties); + Method nodesMethod = ReflectionUtils.findMethod(clusterObject.getClass(), "getNodes"); + List nodesObject = (List) ReflectionUtils.invokeMethod(nodesMethod, clusterObject); + + String[] nodes = convert(nodesObject); + + config = new Config(); + config.useClusterServers() + .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) + .addNodeAddress(nodes).setConnectTimeout(timeout) + .setPassword(password); + } else { + config = new Config(); + String prefix = "redis://"; + Method method = ReflectionUtils.findMethod(RedisProperties.class, "isSsl"); + if (method != null && (Boolean) ReflectionUtils.invokeMethod(method, redisProperties)) { + prefix = "rediss://"; + } + + config.useSingleServer() + .setPingConnectionInterval(redissonProperties.getPingConnectionInterval()) + .setAddress(prefix + redisProperties.getHost() + ":" + redisProperties.getPort()) + .setConnectTimeout(timeout).setDatabase(redisProperties.getDatabase()) + .setPassword(password); + } + return Redisson.create(config); + } + + private String[] convert(List nodesObject) { + List nodes = new ArrayList(nodesObject.size()); + for (String node : nodesObject) { + if (!node.startsWith("redis://") && !node.startsWith("rediss://")) { + nodes.add("redis://" + node); + } else { + nodes.add(node); + } + } + return nodes.toArray(new String[nodes.size()]); + } + + @Bean + public RedissonUtils redissonUtils() { + return new RedissonUtils(redisson()); + } + +} diff --git a/src/main/resources/META-INF/spring.factories b/src/main/resources/META-INF/spring.factories index 94166f6..1f03b75 100644 --- a/src/main/resources/META-INF/spring.factories +++ b/src/main/resources/META-INF/spring.factories @@ -2,4 +2,5 @@ org.springframework.boot.autoconfigure.EnableAutoConfiguration=\ com.senmesh.common.CommonConfiguration,\ com.senmesh.codegenerator.config.CodeConfiguration,\ com.senmesh.frame.redis.config.RedisCacheConfig,\ +com.senmesh.frame.redis.redisson.RedissonConfig,\ com.senmesh.mq.config.RabbitMqConfiguration \ No newline at end of file