From 2c108c462891a7fd88ebe202d9c5c628dff66f04 Mon Sep 17 00:00:00 2001 From: momosv <33799449+momosv@users.noreply.github.com> Date: Sun, 30 May 2021 23:08:55 +0800 Subject: [PATCH] =?UTF-8?q?:art:=20#2138=20=E3=80=90=E4=BC=81=E4=B8=9A?= =?UTF-8?q?=E5=BE=AE=E4=BF=A1=E3=80=91=E4=BC=98=E5=8C=96Redisson=E5=AE=9E?= =?UTF-8?q?=E7=8E=B0=E7=B1=BB=EF=BC=8C=E5=8F=AF=E5=8D=95=E7=8B=AC=E9=85=8D?= =?UTF-8?q?=E7=BD=AEprovider=E7=9A=84redis=20key=EF=BC=8C=E5=B9=B6?= =?UTF-8?q?=E4=BD=BFkeyPrefix=E5=8F=AF=E8=AE=BE=E7=BD=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../config/impl/WxCpTpRedissonConfigImpl.java | 43 +++++++++++++++---- .../service/impl/BaseWxCpTpServiceImpl.java | 26 ++++++++--- 2 files changed, 55 insertions(+), 14 deletions(-) diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java index 28997827b..a33e2d69f 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/config/impl/WxCpTpRedissonConfigImpl.java @@ -26,7 +26,8 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab private final WxRedisOps wxRedisOps; //redis里面key的统一前缀 - private final String keyPrefix = ""; + //private final String keyPrefix = "";//4.0.9.B 有final为不可设置,去掉final改为可设置 + private String keyPrefix = ""; private final String suiteAccessTokenKey = ":suiteAccessTokenKey:"; @@ -298,23 +299,23 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab @Override public boolean isProviderTokenExpired() { //remain time to live in seconds, or key not exist - return wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)) == 0L || wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)) == -2; + return wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)) == 0L || wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)) == -2; } @Override public void updateProviderToken(String providerToken, int expiredInSeconds) { - wxRedisOps.setValue(keyWithPrefix(providerTokenKey), providerToken, expiredInSeconds, TimeUnit.SECONDS); + wxRedisOps.setValue(providerKeyWithPrefix(providerTokenKey), providerToken, expiredInSeconds, TimeUnit.SECONDS); } @Override public String getProviderToken() { - return wxRedisOps.getValue(keyWithPrefix(providerTokenKey)); + return wxRedisOps.getValue(providerKeyWithPrefix(providerTokenKey)); } @Override public WxCpProviderToken getProviderTokenEntity() { - String providerToken = wxRedisOps.getValue(keyWithPrefix(providerTokenKey)); - Long expire = wxRedisOps.getExpire(keyWithPrefix(providerTokenKey)); + String providerToken = wxRedisOps.getValue(providerKeyWithPrefix(providerTokenKey)); + Long expire = wxRedisOps.getExpire(providerKeyWithPrefix(providerTokenKey)); if (StringUtils.isBlank(providerToken) || expire == null || expire == 0 || expire == -2) { return new WxCpProviderToken(); @@ -328,7 +329,7 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab @Override public void expireProviderToken() { - wxRedisOps.expire(keyWithPrefix(providerTokenKey), 0, TimeUnit.SECONDS); + wxRedisOps.expire(providerKeyWithPrefix(providerTokenKey), 0, TimeUnit.SECONDS); } /** @@ -361,7 +362,7 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab @Override public Lock getProviderAccessTokenLock() { - return getLockByKey(String.join(":", this.corpId, LOCKER_PROVIDER_ACCESS_TOKEN)); + return getProviderLockByKey(String.join(":", this.corpId, LOCKER_PROVIDER_ACCESS_TOKEN)); } @Override @@ -390,6 +391,15 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab return this.wxRedisOps.getLock(String.join(":", keyWithPrefix(LOCK_KEY + this.suiteId), key)); } + /** + * 单独处理provider,且不应和suite 有关系 + * @param key + * @return + */ + private Lock getProviderLockByKey(String key) { + return this.wxRedisOps.getLock(String.join(":", providerKeyWithPrefix(LOCK_KEY), key)); + } + @Override public ApacheHttpClientBuilder getApacheHttpClientBuilder() { return this.apacheHttpClientBuilder; @@ -406,7 +416,22 @@ public class WxCpTpRedissonConfigImpl implements WxCpTpConfigStorage, Serializab return WxCpGsonBuilder.create().toJson(this); } + /** + * 一个provider 会有多个suite,需要唯一标识作为前缀 + * @param key + * @return + */ private String keyWithPrefix(String key) { - return keyPrefix + key; + return keyPrefix +":"+suiteId+":" + key; + } + + /** + * provider 应该独享一个key,且不和任何suite关联 + * 一个provider 会有多个suite,不同的suite 都应该指向同一个provider 的数据 + * @param key + * @return + */ + private String providerKeyWithPrefix(String key) { + return keyPrefix +":"+corpId+":" + key; } } diff --git a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java index 9811eca18..f681679b9 100644 --- a/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java +++ b/weixin-java-cp/src/main/java/me/chanjar/weixin/cp/tp/service/impl/BaseWxCpTpServiceImpl.java @@ -305,7 +305,11 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ @Override public String post(String url, String postData) throws WxErrorException { - return execute(SimplePostRequestExecutor.create(this), url, postData); + return execute(SimplePostRequestExecutor.create(this), url, postData,false); + } + + public String post(String url, String postData,boolean withoutSuiteAccessToken) throws WxErrorException { + return execute(SimplePostRequestExecutor.create(this), url, postData,withoutSuiteAccessToken); } /** @@ -313,10 +317,13 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ */ @Override public T execute(RequestExecutor executor, String uri, E data) throws WxErrorException { + return execute(executor, uri, data,false); + } + public T execute(RequestExecutor executor, String uri, E data,boolean withoutSuiteAccessToken) throws WxErrorException { int retryTimes = 0; do { try { - return this.executeInternal(executor, uri, data); + return this.executeInternal(executor, uri, data,withoutSuiteAccessToken); } catch (WxErrorException e) { if (retryTimes + 1 > this.maxRetryTimes) { log.warn("重试达到最大次数【{}】", this.maxRetryTimes); @@ -347,14 +354,22 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ } protected T executeInternal(RequestExecutor executor, String uri, E data) throws WxErrorException { + return executeInternal( executor, uri,data,false); + } + protected T executeInternal(RequestExecutor executor, String uri, E data,boolean withoutSuiteAccessToken) throws WxErrorException { E dataForLog = DataUtils.handleDataWithSecret(data); if (uri.contains("suite_access_token=")) { throw new IllegalArgumentException("uri参数中不允许有suite_access_token: " + uri); } - String suiteAccessToken = getSuiteAccessToken(false); + String uriWithAccessToken; + if(!withoutSuiteAccessToken){ + String suiteAccessToken = getSuiteAccessToken(false); + uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; + }else{ + uriWithAccessToken = uri; + } - String uriWithAccessToken = uri + (uri.contains("?") ? "&" : "?") + "suite_access_token=" + suiteAccessToken; try { T result = executor.execute(uriWithAccessToken, data, WxType.CP); @@ -452,9 +467,10 @@ public abstract class BaseWxCpTpServiceImpl implements WxCpTpService, Requ JsonObject jsonObject = new JsonObject(); jsonObject.addProperty("corpid", configStorage.getCorpId()); jsonObject.addProperty("provider_secret", configStorage.getProviderSecret()); + //providerAccessToken 的获取不需要suiteAccessToken ,一不必要,二可以提高效率 WxCpProviderToken wxCpProviderToken = WxCpProviderToken.fromJson(this.post(this.configStorage.getApiUrl(GET_PROVIDER_TOKEN) - , jsonObject.toString())); + , jsonObject.toString(),true)); String providerAccessToken = wxCpProviderToken.getProviderAccessToken(); Integer expiresIn = wxCpProviderToken.getExpiresIn();