Pārlūkot izejas kodu

🎨 #1488 公众号模块支持分布式锁,设置token过期时加锁

dev1
007gzs pirms 5 gadiem
committed by GitHub
vecāks
revīzija
d752c48dc8
Šim parakstam datu bāzē netika atrasta zināma atslēga GPG atslēgas ID: 4AEE18F83AFDEB23
4 mainītis faili ar 56 papildinājumiem un 4 dzēšanām
  1. +11
    -1
      weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java
  2. +11
    -1
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java
  3. +11
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java
  4. +23
    -2
      weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java

+ 11
- 1
weixin-java-miniapp/src/main/java/cn/binarywang/wx/miniapp/api/impl/WxMaServiceImpl.java Parādīt failu

@@ -288,7 +288,17 @@ public class WxMaServiceImpl implements WxMaService, RequestHttp<CloseableHttpCl
|| error.getErrorCode() == ERR_42001
|| error.getErrorCode() == ERR_40014) {
// 强制设置WxMaConfig的access token过期了,这样在下一次请求里就会刷新access token
this.getWxMaConfig().expireAccessToken();
Lock lock = this.getWxMaConfig().getAccessTokenLock();
lock.lock();
try {
if(StringUtils.equals(this.getWxMaConfig().getAccessToken(), accessToken)){
this.getWxMaConfig().expireAccessToken();
}
} catch (Exception ex){
this.getWxMaConfig().expireAccessToken();
}finally {
lock.unlock();
}
if (this.getWxMaConfig().autoRefreshToken()) {
return this.execute(executor, uri, data);
}


+ 11
- 1
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImpl.java Parādīt failu

@@ -351,7 +351,17 @@ public abstract class BaseWxMpServiceImpl<H, P> implements WxMpService, RequestH
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxMpConfigStorage().expireAccessToken();
Lock lock = this.getWxMpConfigStorage().getAccessTokenLock();
lock.lock();
try{
if(StringUtils.equals(this.getWxMpConfigStorage().getAccessToken(), accessToken)){
this.getWxMpConfigStorage().expireAccessToken();
}
} catch (Exception ex){
this.getWxMpConfigStorage().expireAccessToken();
} finally {
lock.unlock();
}
if (this.getWxMpConfigStorage().autoRefreshToken()) {
return this.execute(executor, uri, data);
}


+ 11
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/config/impl/WxMpRedisConfigImpl.java Parādīt failu

@@ -1,9 +1,13 @@
package me.chanjar.weixin.mp.config.impl;

import me.chanjar.weixin.common.util.locks.JedisDistributedLock;
import me.chanjar.weixin.mp.enums.TicketType;
import redis.clients.jedis.Jedis;
import redis.clients.jedis.JedisPool;

import java.util.concurrent.locks.Lock;
import java.util.concurrent.locks.ReentrantLock;

/**
* 基于Redis的微信配置provider.
*
@@ -17,6 +21,7 @@ import redis.clients.jedis.JedisPool;
@SuppressWarnings("hiding")
public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl {
private static final String ACCESS_TOKEN_KEY = "wx:access_token:";
private static final String LOCK_KEY = "wx:lock:";

/**
* 使用连接池保证线程安全.
@@ -24,6 +29,7 @@ public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl {
private final JedisPool jedisPool;

private String accessTokenKey;
private String lockKey;

public WxMpRedisConfigImpl(JedisPool jedisPool) {
this.jedisPool = jedisPool;
@@ -36,6 +42,11 @@ public class WxMpRedisConfigImpl extends WxMpDefaultConfigImpl {
public void setAppId(String appId) {
super.setAppId(appId);
this.accessTokenKey = ACCESS_TOKEN_KEY.concat(appId);
this.lockKey = ACCESS_TOKEN_KEY.concat(appId).concat(":");
accessTokenLock = new JedisDistributedLock(jedisPool, lockKey.concat("accessTokenLock"));
jsapiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("jsapiTicketLock"));
sdkTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("sdkTicketLock"));
cardApiTicketLock = new JedisDistributedLock(jedisPool, lockKey.concat("cardApiTicketLock"));
}

private String getTicketRedisKey(TicketType type) {


+ 23
- 2
weixin-java-open/src/main/java/me/chanjar/weixin/open/api/impl/WxOpenComponentServiceImpl.java Parādīt failu

@@ -155,7 +155,18 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxOpenConfigStorage().expireComponentAccessToken();
Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock();
lock.lock();
try {
if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){
this.getWxOpenConfigStorage().expireComponentAccessToken();
}
} catch (Exception ex) {
this.getWxOpenConfigStorage().expireComponentAccessToken();
}finally {
lock.unlock();
}

if (this.getWxOpenConfigStorage().autoRefreshToken()) {
return this.post(uri, postData, accessTokenKey);
}
@@ -188,7 +199,17 @@ public class WxOpenComponentServiceImpl implements WxOpenComponentService {
*/
if (error.getErrorCode() == 42001 || error.getErrorCode() == 40001 || error.getErrorCode() == 40014) {
// 强制设置wxMpConfigStorage它的access token过期了,这样在下一次请求里就会刷新access token
this.getWxOpenConfigStorage().expireComponentAccessToken();
Lock lock = this.getWxOpenConfigStorage().getComponentAccessTokenLock();
lock.lock();
try {
if (StringUtils.equals(componentAccessToken, this.getWxOpenConfigStorage().getComponentAccessToken()){
this.getWxOpenConfigStorage().expireComponentAccessToken();
}
} catch (Exception ex) {
this.getWxOpenConfigStorage().expireComponentAccessToken();
}finally {
lock.unlock();
}
if (this.getWxOpenConfigStorage().autoRefreshToken()) {
return this.get(uri, accessTokenKey);
}


Notiek ielāde…
Atcelt
Saglabāt