From 3b476d7228171c8226865e91e43a9bfe6f55dd23 Mon Sep 17 00:00:00 2001 From: Mario Luo Date: Sun, 19 Apr 2020 05:20:30 +0800 Subject: [PATCH 1/3] =?UTF-8?q?weixin-java-open=E4=BC=98=E5=8C=96redis?= =?UTF-8?q?=E7=9B=B8=E5=85=B3,=20=E9=9B=86=E6=88=90spring-boot=E5=A2=9E?= =?UTF-8?q?=E5=8A=A0=E7=89=B9=E6=80=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 1. 使用提取的redis抽象层 2. 集成spring-boot支持redistemplate, http客户端配置, 优化代码 3. wx-java-open-spring-boot-starter修改对redis相关客户端依赖为可选 --- .../README.md | 35 +-- .../wx-java-open-spring-boot-starter/pom.xml | 10 +- .../WxOpenStorageAutoConfiguration.java | 81 +++--- .../open/properties/RedisProperties.java | 2 +- .../open/properties/WxOpenProperties.java | 51 +++- .../weixin/common/redis/JedisWxRedisOps.java | 10 +- .../api/impl/WxOpenInRedisConfigStorage.java | 106 +++----- .../impl/WxOpenInRedissonConfigStorage.java | 250 +++++++++--------- 8 files changed, 297 insertions(+), 248 deletions(-) diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/README.md b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md index fd00f03531..44333f8e4f 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/README.md +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/README.md @@ -9,26 +9,27 @@ ``` 2. 添加配置(application.properties) - ``` - # 开放平台配置(必填) - wx.open.appId = @appId - wx.open.secret = @secret - wx.open.token = @token - wx.open.aesKey = @aesKey - # 存储配置redis(可选), 优先使用(wx.open.config-storage.redis)配置的redis, 支持自定注入的JedisPool - wx.open.config-storage.type = redis # 可选值, memory(默认), redis - wx.open.config-storage.redis.host = 127.0.0.1 - wx.open.config-storage.redis.port = 6379 + ```properties + # 公众号配置(必填) + wx.open.appId = appId + wx.open.secret = @secret + wx.open.token = @token + wx.open.aesKey = @aesKey + # 存储配置redis(可选) + # 优先注入容器的(JedisPool, RedissonClient), 当配置了wx.open.config-storage.redis.host, 不会使用容器注入redis连接配置 + wx.open.config-storage.type = redis # 配置类型: memory(默认), redis(jedis), jedis, redisson, redistemplate + wx.open.config-storage.key-prefix = wx # 相关redis前缀配置: wx(默认) + wx.open.config-storage.redis.host = 127.0.0.1 + wx.open.config-storage.redis.port = 6379 + # http客户端配置 + wx.open.config-storage.http-client-type=httpclient # http客户端类型: httpclient(默认) + wx.open.config-storage.http-proxy-host= + wx.open.config-storage.http-proxy-port= + wx.open.config-storage.http-proxy-username= + wx.open.config-storage.http-proxy-password= ``` 3. 支持自动注入的类型: `WxOpenService, WxOpenMessageRouter, WxOpenComponentService` 4. 覆盖自动配置: 自定义注入的bean会覆盖自动注入的 - WxOpenConfigStorage - WxOpenService - - - - - - - diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml index 3a2befea66..61461a162d 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/pom.xml @@ -22,12 +22,18 @@ redis.clients jedis - compile + provided org.redisson redisson - compile + provided + + + org.springframework.data + spring-data-redis + ${spring.boot.version} + provided diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java index a92b3483b9..c97f00451d 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/config/WxOpenStorageAutoConfiguration.java @@ -3,20 +3,23 @@ import com.binarywang.spring.starter.wxjava.open.properties.RedisProperties; import com.binarywang.spring.starter.wxjava.open.properties.WxOpenProperties; import lombok.RequiredArgsConstructor; +import me.chanjar.weixin.common.redis.JedisWxRedisOps; +import me.chanjar.weixin.common.redis.RedisTemplateWxRedisOps; +import me.chanjar.weixin.common.redis.RedissonWxRedisOps; +import me.chanjar.weixin.common.redis.WxRedisOps; import me.chanjar.weixin.open.api.WxOpenConfigStorage; import me.chanjar.weixin.open.api.impl.WxOpenInMemoryConfigStorage; import me.chanjar.weixin.open.api.impl.WxOpenInRedisConfigStorage; -import me.chanjar.weixin.open.api.impl.WxOpenInRedissonConfigStorage; import org.apache.commons.lang3.StringUtils; import org.redisson.Redisson; import org.redisson.api.RedissonClient; import org.redisson.config.Config; import org.redisson.config.TransportMode; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.beans.factory.annotation.Value; import org.springframework.boot.autoconfigure.condition.ConditionalOnMissingBean; +import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; +import org.springframework.data.redis.core.StringRedisTemplate; import redis.clients.jedis.JedisPool; import redis.clients.jedis.JedisPoolConfig; @@ -29,15 +32,7 @@ @RequiredArgsConstructor public class WxOpenStorageAutoConfiguration { private final WxOpenProperties properties; - - @Autowired(required = false) - private JedisPool jedisPool; - - @Autowired(required = false) - private RedissonClient redissonClient; - - @Value("${wx.open.config-storage.redis.host:}") - private String redisHost; + private final ApplicationContext applicationContext; @Bean @ConditionalOnMissingBean(WxOpenConfigStorage.class) @@ -45,43 +40,63 @@ public WxOpenConfigStorage wxOpenConfigStorage() { WxOpenProperties.ConfigStorage storage = properties.getConfigStorage(); WxOpenProperties.StorageType type = storage.getType(); - if (type == WxOpenProperties.StorageType.redis) { - return getWxOpenInRedisConfigStorage(); + WxOpenInMemoryConfigStorage config; + if (type == WxOpenProperties.StorageType.redis || type == WxOpenProperties.StorageType.jedis) { + config = getWxOpenInRedisConfigStorage(); + } else if (type == WxOpenProperties.StorageType.redisson) { + config = getWxOpenInRedissonConfigStorage(); + } else if (type == WxOpenProperties.StorageType.redistemplate) { + config = getWxOpenInRedisTemplateConfigStorage(); + } else { + config = getWxOpenInMemoryConfigStorage(); } - if (type == WxOpenProperties.StorageType.jedis) { - return getWxOpenInRedisConfigStorage(); - } - - if (type == WxOpenProperties.StorageType.redisson) { - return getWxOpenInRedissonConfigStorage(); + WxOpenProperties.ConfigStorage configStorageProperties = properties.getConfigStorage(); + config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); + config.setHttpProxyHost(configStorageProperties.getHttpProxyHost()); + config.setHttpProxyUsername(configStorageProperties.getHttpProxyUsername()); + config.setHttpProxyPassword(configStorageProperties.getHttpProxyPassword()); + if (configStorageProperties.getHttpProxyPort() != null) { + config.setHttpProxyPort(configStorageProperties.getHttpProxyPort()); } - return getWxOpenInMemoryConfigStorage(); + return config; } private WxOpenInMemoryConfigStorage getWxOpenInMemoryConfigStorage() { WxOpenInMemoryConfigStorage config = new WxOpenInMemoryConfigStorage(); - config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); return config; } private WxOpenInRedisConfigStorage getWxOpenInRedisConfigStorage() { - JedisPool poolToUse = jedisPool; - if (jedisPool == null || StringUtils.isNotEmpty(redisHost)) { - poolToUse = getJedisPool(); + RedisProperties redisProperties = properties.getConfigStorage().getRedis(); + JedisPool jedisPool; + if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) { + jedisPool = getJedisPool(); + } else { + jedisPool = applicationContext.getBean(JedisPool.class); } - WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(poolToUse, properties.getConfigStorage().getKeyPrefix()); - config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); + WxRedisOps redisOps = new JedisWxRedisOps(jedisPool); + WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); return config; } - private WxOpenInRedissonConfigStorage getWxOpenInRedissonConfigStorage() { - RedissonClient redissonClientToUse = this.redissonClient; - if (redissonClient == null) { - redissonClientToUse = getRedissonClient(); + private WxOpenInRedisConfigStorage getWxOpenInRedissonConfigStorage() { + RedisProperties redisProperties = properties.getConfigStorage().getRedis(); + RedissonClient redissonClient; + if (redisProperties != null && StringUtils.isNotEmpty(redisProperties.getHost())) { + redissonClient = getRedissonClient(); + } else { + redissonClient = applicationContext.getBean(RedissonClient.class); } - WxOpenInRedissonConfigStorage config = new WxOpenInRedissonConfigStorage(redissonClientToUse, properties.getConfigStorage().getKeyPrefix()); - config.setWxOpenInfo(properties.getAppId(), properties.getSecret(), properties.getToken(), properties.getAesKey()); + WxRedisOps redisOps = new RedissonWxRedisOps(redissonClient); + WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); + return config; + } + + private WxOpenInRedisConfigStorage getWxOpenInRedisTemplateConfigStorage() { + StringRedisTemplate redisTemplate = applicationContext.getBean(StringRedisTemplate.class); + WxRedisOps redisOps = new RedisTemplateWxRedisOps(redisTemplate); + WxOpenInRedisConfigStorage config = new WxOpenInRedisConfigStorage(redisOps, properties.getConfigStorage().getKeyPrefix()); return config; } diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java index 565afa07f5..a03d3a47f6 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/RedisProperties.java @@ -16,7 +16,7 @@ public class RedisProperties implements Serializable { /** * 主机地址. */ - private String host = "127.0.0.1"; + private String host; /** * 端口号. diff --git a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java index 77aabad54a..9c9986bacc 100644 --- a/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java +++ b/spring-boot-starters/wx-java-open-spring-boot-starter/src/main/java/com/binarywang/spring/starter/wxjava/open/properties/WxOpenProperties.java @@ -40,7 +40,7 @@ public class WxOpenProperties { private String aesKey; /** - * 存储策略, memory, redis. + * 存储策略. */ private ConfigStorage configStorage = new ConfigStorage(); @@ -49,11 +49,45 @@ public class WxOpenProperties { public static class ConfigStorage implements Serializable { private static final long serialVersionUID = 4815731027000065434L; + /** + * 存储类型. + */ private StorageType type = memory; + /** + * 指定key前缀. + */ + private String keyPrefix = "wx"; + + /** + * redis连接配置. + */ private RedisProperties redis = new RedisProperties(); - private String keyPrefix; + /** + * http客户端类型. + */ + private HttpClientType httpClientType = HttpClientType.httpclient; + + /** + * http代理主机. + */ + private String httpProxyHost; + + /** + * http代理端口. + */ + private Integer httpProxyPort; + + /** + * http代理用户名. + */ + private String httpProxyUsername; + + /** + * http代理密码. + */ + private String httpProxyPassword; } @@ -73,6 +107,17 @@ public enum StorageType { /** * redisson. */ - redisson + redisson, + /** + * redistemplate + */ + redistemplate + } + + public enum HttpClientType { + /** + * HttpClient. + */ + httpclient } } diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java index 0762e67dc7..0b8dd01e79 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java @@ -3,7 +3,7 @@ import lombok.RequiredArgsConstructor; import me.chanjar.weixin.common.util.locks.JedisDistributedLock; import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; +import redis.clients.util.Pool; import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; @@ -11,7 +11,7 @@ @RequiredArgsConstructor public class JedisWxRedisOps implements WxRedisOps { - private final JedisPool jedisPool; + private final Pool jedisPool; @Override public String getValue(String key) { @@ -23,7 +23,11 @@ public String getValue(String key) { @Override public void setValue(String key, String value, int expire, TimeUnit timeUnit) { try (Jedis jedis = this.jedisPool.getResource()) { - jedis.psetex(key, timeUnit.toMillis(expire), value); + if (expire > 0) { + jedis.psetex(key, timeUnit.toMillis(expire), value); + } else { + jedis.set(key, value); + } } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java index a681e2931e..31c199bba7 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedisConfigStorage.java @@ -1,10 +1,12 @@ package me.chanjar.weixin.open.api.impl; -import me.chanjar.weixin.common.util.locks.JedisDistributedLock; +import lombok.NonNull; +import me.chanjar.weixin.common.redis.JedisWxRedisOps; +import me.chanjar.weixin.common.redis.WxRedisOps; import redis.clients.jedis.Jedis; -import redis.clients.jedis.JedisPool; import redis.clients.util.Pool; +import java.util.concurrent.TimeUnit; import java.util.concurrent.locks.Lock; /** @@ -12,163 +14,127 @@ */ public class WxOpenInRedisConfigStorage extends AbstractWxOpenInRedisConfigStorage { - protected final Pool jedisPool; + private final WxRedisOps redisOps; public WxOpenInRedisConfigStorage(Pool jedisPool) { - this.jedisPool = jedisPool; + this(jedisPool, null); } - public WxOpenInRedisConfigStorage(Pool jedisPool, String keyPrefix) { - this.jedisPool = jedisPool; - this.keyPrefix = keyPrefix; + public WxOpenInRedisConfigStorage(@NonNull Pool jedisPool, String keyPrefix) { + this(new JedisWxRedisOps(jedisPool), keyPrefix); } - public WxOpenInRedisConfigStorage(JedisPool jedisPool) { - this.jedisPool = jedisPool; + public WxOpenInRedisConfigStorage(@NonNull WxRedisOps redisOps, String keyPrefix) { + this.redisOps = redisOps; + this.keyPrefix = keyPrefix; } @Override public String getComponentVerifyTicket() { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.componentVerifyTicketKey); - } + return redisOps.getValue(this.componentVerifyTicketKey); } @Override public void setComponentVerifyTicket(String componentVerifyTicket) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.set(this.componentVerifyTicketKey, componentVerifyTicket); - } + redisOps.setValue(this.componentVerifyTicketKey, componentVerifyTicket, Integer.MAX_VALUE, TimeUnit.SECONDS); } @Override public String getComponentAccessToken() { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.componentAccessTokenKey); - } + return redisOps.getValue(this.componentAccessTokenKey); } @Override public boolean isComponentAccessTokenExpired() { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.ttl(this.componentAccessTokenKey) < 2; - } + Long expire = redisOps.getExpire(this.componentAccessTokenKey); + return expire == null || expire < 2; } @Override public void expireComponentAccessToken() { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.expire(this.componentAccessTokenKey, 0); - } + redisOps.expire(this.componentAccessTokenKey, 0, TimeUnit.SECONDS); } @Override public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.setex(this.componentAccessTokenKey, expiresInSeconds - 200, componentAccessToken); - } + redisOps.setValue(this.componentAccessTokenKey, componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); } @Override public String getAuthorizerRefreshToken(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.getKey(this.authorizerRefreshTokenKey, appId)); - } + return redisOps.getValue(this.getKey(this.authorizerRefreshTokenKey, appId)); } @Override public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.set(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken); - } + redisOps.setValue(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken, 0, TimeUnit.SECONDS); } @Override public String getAuthorizerAccessToken(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.getKey(this.authorizerAccessTokenKey, appId)); - } + return redisOps.getValue(this.getKey(this.authorizerAccessTokenKey, appId)); } @Override public boolean isAuthorizerAccessTokenExpired(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.ttl(this.getKey(this.authorizerAccessTokenKey, appId)) < 2; - } + Long expire = redisOps.getExpire(this.getKey(this.authorizerAccessTokenKey, appId)); + return expire == null || expire < 2; } @Override public void expireAuthorizerAccessToken(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0); - } + redisOps.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0, TimeUnit.SECONDS); } @Override public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.setex(this.getKey(this.authorizerAccessTokenKey, appId), expiresInSeconds - 200, authorizerAccessToken); - } + redisOps.setValue(this.getKey(this.authorizerAccessTokenKey, appId), authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); } @Override public String getJsapiTicket(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.getKey(this.jsapiTicketKey, appId)); - } + return redisOps.getValue(this.getKey(this.jsapiTicketKey, appId)); } @Override public boolean isJsapiTicketExpired(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.ttl(this.getKey(this.jsapiTicketKey, appId)) < 2; - } + Long expire = redisOps.getExpire(this.getKey(this.jsapiTicketKey, appId)); + return expire == null || expire < 2; } @Override public void expireJsapiTicket(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.expire(this.getKey(this.jsapiTicketKey, appId), 0); - } + redisOps.expire(this.getKey(this.jsapiTicketKey, appId), 0, TimeUnit.SECONDS); } @Override public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.setex(this.getKey(this.jsapiTicketKey, appId), expiresInSeconds - 200, jsapiTicket); - } + redisOps.setValue(this.getKey(this.jsapiTicketKey, appId), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); } @Override public String getCardApiTicket(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.get(this.getKey(this.cardApiTicket, appId)); - } + return redisOps.getValue(this.getKey(this.cardApiTicket, appId)); } @Override public boolean isCardApiTicketExpired(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - return jedis.ttl(this.getKey(this.cardApiTicket, appId)) < 2; - } + Long expire = redisOps.getExpire(this.getKey(this.cardApiTicket, appId)); + return expire == null || expire < 2; } @Override public void expireCardApiTicket(String appId) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.expire(this.getKey(this.cardApiTicket, appId), 0); - } + redisOps.expire(this.getKey(this.cardApiTicket, appId), 0, TimeUnit.SECONDS); } @Override public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { - try (Jedis jedis = this.jedisPool.getResource()) { - jedis.setex(this.getKey(this.cardApiTicket, appId), expiresInSeconds - 200, cardApiTicket); - } + redisOps.setValue(this.getKey(this.cardApiTicket, appId), cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); } @Override public Lock getLockByKey(String key) { - return new JedisDistributedLock(jedisPool, getKey(lockKey, key)); + return redisOps.getLock(key); } } diff --git a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java index 7fdf1ba1b6..070d9ebf88 100644 --- a/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java +++ b/weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenInRedissonConfigStorage.java @@ -1,128 +1,140 @@ package me.chanjar.weixin.open.api.impl; -import java.util.concurrent.TimeUnit; +import lombok.NonNull; +import me.chanjar.weixin.common.redis.RedissonWxRedisOps; +import me.chanjar.weixin.common.redis.WxRedisOps; import org.redisson.api.RedissonClient; +import java.util.concurrent.TimeUnit; +import java.util.concurrent.locks.Lock; + /** * @author yangyidian * @date 2020/01/06 **/ -public class WxOpenInRedissonConfigStorage extends AbstractWxOpenInRedisConfigStorage{ - - private RedissonClient redissonClient; - - public WxOpenInRedissonConfigStorage(RedissonClient redissonClient, String keyPrefix) { - this.keyPrefix = keyPrefix; - this.redissonClient = redissonClient; - } - - public WxOpenInRedissonConfigStorage(RedissonClient redissonClient) { - this.redissonClient = redissonClient; - } - - @Override - public String getComponentVerifyTicket() { - Object value = redissonClient.getBucket(this.componentVerifyTicketKey).get(); - return value == null ? null : value.toString(); - } - - @Override - public void setComponentVerifyTicket(String componentVerifyTicket) { - redissonClient.getBucket(this.componentVerifyTicketKey).set(componentVerifyTicket); - } - - @Override - public String getComponentAccessToken() { - Object value = redissonClient.getBucket(this.componentAccessTokenKey).get(); - return value == null ? null : value.toString(); - } - - @Override - public boolean isComponentAccessTokenExpired() { - return redissonClient.getBucket(this.componentAccessTokenKey).remainTimeToLive() < 2; - } - - @Override - public void expireComponentAccessToken() { - redissonClient.getBucket(this.componentAccessTokenKey).expire(0, TimeUnit.SECONDS); - } - - @Override - public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { - redissonClient.getBucket(this.componentAccessTokenKey).set(componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); - } - - @Override - public String getAuthorizerRefreshToken(String appId) { - Object value = redissonClient.getBucket(this.getKey(this.authorizerRefreshTokenKey, appId)).get(); - return value == null ? null : value.toString(); - } - - @Override - public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { - redissonClient.getBucket(this.getKey(this.authorizerRefreshTokenKey, appId)).set(authorizerRefreshToken); - } - - @Override - public String getAuthorizerAccessToken(String appId) { - Object value = redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).get(); - return value == null ? null : value.toString(); - } - - @Override - public boolean isAuthorizerAccessTokenExpired(String appId) { - return redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).remainTimeToLive() < 2; - } - - @Override - public void expireAuthorizerAccessToken(String appId) { - redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).expire(0, TimeUnit.SECONDS); - } - - @Override - public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { - redissonClient.getBucket(this.getKey(this.authorizerAccessTokenKey, appId)).set(authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); - } - - @Override - public String getJsapiTicket(String appId) { - Object value = redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).get(); - return value == null ? null : value.toString(); - } - - @Override - public boolean isJsapiTicketExpired(String appId) { - return redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).remainTimeToLive() < 2; - } - - @Override - public void expireJsapiTicket(String appId) { - redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).expire(0, TimeUnit.SECONDS); - } - - @Override - public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { - redissonClient.getBucket(this.getKey(this.jsapiTicketKey, appId)).set(jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); - } - - @Override - public String getCardApiTicket(String appId) { - Object value = redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).get(); - return value == null ? null : value.toString(); - } - - @Override - public boolean isCardApiTicketExpired(String appId) { - return redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).remainTimeToLive() < 2; - } - - @Override - public void expireCardApiTicket(String appId) { - redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).expire(0 ,TimeUnit.SECONDS); - } - - @Override - public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { - redissonClient.getBucket(this.getKey(this.cardApiTicket, appId)).set(cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); - } +public class WxOpenInRedissonConfigStorage extends AbstractWxOpenInRedisConfigStorage { + + private final WxRedisOps redisOps; + + public WxOpenInRedissonConfigStorage(@NonNull RedissonClient redissonClient, String keyPrefix) { + this(new RedissonWxRedisOps(redissonClient), keyPrefix); + } + + public WxOpenInRedissonConfigStorage(@NonNull RedissonClient redissonClient) { + this(redissonClient, null); + } + + private WxOpenInRedissonConfigStorage(@NonNull WxRedisOps redisOps, String keyPrefix) { + this.redisOps = redisOps; + this.keyPrefix = keyPrefix; + } + + @Override + public String getComponentVerifyTicket() { + return redisOps.getValue(this.componentVerifyTicketKey); + } + + @Override + public void setComponentVerifyTicket(String componentVerifyTicket) { + redisOps.setValue(this.componentVerifyTicketKey, componentVerifyTicket, Integer.MAX_VALUE, TimeUnit.SECONDS); + } + + @Override + public String getComponentAccessToken() { + return redisOps.getValue(this.componentAccessTokenKey); + } + + @Override + public boolean isComponentAccessTokenExpired() { + Long expire = redisOps.getExpire(this.componentAccessTokenKey); + return expire == null || expire < 2; + } + + @Override + public void expireComponentAccessToken() { + redisOps.expire(this.componentAccessTokenKey, 0, TimeUnit.SECONDS); + } + + @Override + public void updateComponentAccessToken(String componentAccessToken, int expiresInSeconds) { + redisOps.setValue(this.componentAccessTokenKey, componentAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public String getAuthorizerRefreshToken(String appId) { + return redisOps.getValue(this.getKey(this.authorizerRefreshTokenKey, appId)); + } + + @Override + public void setAuthorizerRefreshToken(String appId, String authorizerRefreshToken) { + redisOps.setValue(this.getKey(this.authorizerRefreshTokenKey, appId), authorizerRefreshToken, 0, TimeUnit.SECONDS); + } + + @Override + public String getAuthorizerAccessToken(String appId) { + return redisOps.getValue(this.getKey(this.authorizerAccessTokenKey, appId)); + } + + @Override + public boolean isAuthorizerAccessTokenExpired(String appId) { + Long expire = redisOps.getExpire(this.getKey(this.authorizerAccessTokenKey, appId)); + return expire == null || expire < 2; + } + + @Override + public void expireAuthorizerAccessToken(String appId) { + redisOps.expire(this.getKey(this.authorizerAccessTokenKey, appId), 0, TimeUnit.SECONDS); + } + + @Override + public void updateAuthorizerAccessToken(String appId, String authorizerAccessToken, int expiresInSeconds) { + redisOps.setValue(this.getKey(this.authorizerAccessTokenKey, appId), authorizerAccessToken, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public String getJsapiTicket(String appId) { + return redisOps.getValue(this.getKey(this.jsapiTicketKey, appId)); + } + + @Override + public boolean isJsapiTicketExpired(String appId) { + Long expire = redisOps.getExpire(this.getKey(this.jsapiTicketKey, appId)); + return expire == null || expire < 2; + } + + @Override + public void expireJsapiTicket(String appId) { + redisOps.expire(this.getKey(this.jsapiTicketKey, appId), 0, TimeUnit.SECONDS); + } + + @Override + public void updateJsapiTicket(String appId, String jsapiTicket, int expiresInSeconds) { + redisOps.setValue(this.getKey(this.jsapiTicketKey, appId), jsapiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public String getCardApiTicket(String appId) { + return redisOps.getValue(this.getKey(this.cardApiTicket, appId)); + } + + @Override + public boolean isCardApiTicketExpired(String appId) { + Long expire = redisOps.getExpire(this.getKey(this.cardApiTicket, appId)); + return expire == null || expire < 2; + } + + @Override + public void expireCardApiTicket(String appId) { + redisOps.expire(this.getKey(this.cardApiTicket, appId), 0, TimeUnit.SECONDS); + } + + @Override + public void updateCardApiTicket(String appId, String cardApiTicket, int expiresInSeconds) { + redisOps.setValue(this.getKey(this.cardApiTicket, appId), cardApiTicket, expiresInSeconds - 200, TimeUnit.SECONDS); + } + + @Override + public Lock getLockByKey(String key) { + return redisOps.getLock(key); + } } From 6c355fd21f07d7eea346689600dc228cfec809e4 Mon Sep 17 00:00:00 2001 From: Mario Luo Date: Sun, 19 Apr 2020 05:38:46 +0800 Subject: [PATCH 2/3] =?UTF-8?q?=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../README.md | 49 +++++++++++-------- .../wx-java-mp-spring-boot-starter/README.md | 8 +-- 2 files changed, 33 insertions(+), 24 deletions(-) diff --git a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md index fe75ef4e3e..e58dfc8c84 100644 --- a/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md +++ b/spring-boot-starters/wx-java-miniapp-spring-boot-starter/README.md @@ -1,26 +1,35 @@ -# 使用说明 -1. 在自己的Spring Boot项目里,引入maven依赖 -```xml +# wx-java-miniapp-spring-boot-starter +## 快速开始 +1. 引入依赖 + ```xml com.github.binarywang wx-java-miniapp-spring-boot-starter ${version} - ``` -2. 添加配置(application.yml) -```yml -wx: - miniapp: - appid: 111 - secret: 111 - token: 111 - aesKey: 111 - msgDataFormat: JSON -``` - - - - - - + ``` +2. 添加配置(application.properties) + ```properties + # 公众号配置(必填) + wx.miniapp.appid = appId + wx.miniapp.secret = @secret + wx.miniapp.token = @token + wx.miniapp.aesKey = @aesKey + wx.miniapp.msgDataFormat = @msgDataFormat # 消息格式,XML或者JSON. + # 存储配置redis(可选) + # 注意: 指定redis.host值后不会使用容器注入的redis连接(JedisPool) + wx.miniapp.config-storage.type = jedis # 配置类型: memory(默认), jedis, redistemplate + wx.miniapp.config-storage.key-prefix = wa # 相关redis前缀配置: wa(默认) + wx.miniapp.config-storage.redis.host = 127.0.0.1 + wx.miniapp.config-storage.redis.port = 6379 + # http客户端配置 + wx.miniapp.config-storage.http-client-type=httpclient # http客户端类型: httpclient(默认) + wx.miniapp.config-storage.http-proxy-host= + wx.miniapp.config-storage.http-proxy-port= + wx.miniapp.config-storage.http-proxy-username= + wx.miniapp.config-storage.http-proxy-password= + ``` +3. 自动注入的类型 +- `WxMaService` +- `WxMaConfig` diff --git a/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md b/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md index 58c8efbdea..65cc5bbbf1 100644 --- a/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md +++ b/spring-boot-starters/wx-java-mp-spring-boot-starter/README.md @@ -1,4 +1,4 @@ -# wx-java-mp-starter +# wx-java-mp-spring-boot-starter ## 快速开始 1. 引入依赖 ```xml @@ -27,9 +27,9 @@ wx.mp.config-storage.http-proxy-username= wx.mp.config-storage.http-proxy-password= ``` -3. 支持自动注入的类型 - -`WxMpService`以及~~相关的服务类, 比如: `wxMpService.getXxxService`。~~ +3. 自动注入的类型 +- `WxMpService`以及~~相关的服务类, 比如: `wxMpService.getXxxService`。~~ +- `WxMpConfigStorage` From 8938bb3bbff4670aa2fb35adaf570c8571eb7052 Mon Sep 17 00:00:00 2001 From: Mario Luo Date: Sun, 19 Apr 2020 05:41:08 +0800 Subject: [PATCH 3/3] =?UTF-8?q?=E4=BF=AE=E5=A4=8D=E8=8B=A5=E5=B9=B2?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../me/chanjar/weixin/common/redis/JedisWxRedisOps.java | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java index 0b8dd01e79..ede2fcd8bd 100644 --- a/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java +++ b/weixin-java-common/src/main/java/me/chanjar/weixin/common/redis/JedisWxRedisOps.java @@ -23,11 +23,7 @@ public String getValue(String key) { @Override public void setValue(String key, String value, int expire, TimeUnit timeUnit) { try (Jedis jedis = this.jedisPool.getResource()) { - if (expire > 0) { - jedis.psetex(key, timeUnit.toMillis(expire), value); - } else { - jedis.set(key, value); - } + jedis.psetex(key, timeUnit.toMillis(expire), value); } }