From 22abef68ec4cf5d2ee1d427c4fda1cd92cb0da36 Mon Sep 17 00:00:00 2001 From: roger <47755482@qq.com> Date: Fri, 13 Jul 2018 11:20:39 +0800 Subject: [PATCH] =?UTF-8?q?AccessTokenApi=E8=8E=B7=E5=8F=96accessToken?= =?UTF-8?q?=E9=80=9A=E8=BF=87ThreadLocal=E6=96=B9=E5=BC=8F=EF=BC=8C?= =?UTF-8?q?=E4=B8=8D=E7=94=A8sync=EF=BC=8C=E5=8F=AF=E8=83=BD=E4=BC=9A?= =?UTF-8?q?=E5=BD=B1=E5=93=8D=E6=95=88=E7=8E=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../jfinal/weixin/sdk/api/AccessTokenApi.java | 31 ++++++++++--------- 1 file changed, 17 insertions(+), 14 deletions(-) diff --git a/src/main/java/com/jfinal/weixin/sdk/api/AccessTokenApi.java b/src/main/java/com/jfinal/weixin/sdk/api/AccessTokenApi.java index 542682b..7c417b7 100644 --- a/src/main/java/com/jfinal/weixin/sdk/api/AccessTokenApi.java +++ b/src/main/java/com/jfinal/weixin/sdk/api/AccessTokenApi.java @@ -32,46 +32,49 @@ public class AccessTokenApi { private static String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential"; // 用于手动设置的 accessToken - private static AccessToken accessToken=null; + private static ThreadLocal< AccessToken> accessTokenThreadLocal=new ThreadLocal<>(); public static void setAccessToken(AccessToken ak){ - accessToken=ak; + accessTokenThreadLocal.set(ak); ; } public static void removeAccessToken(){ - accessToken=null; + accessTokenThreadLocal.remove(); } + /** * 从缓存中获取 access token,如果未取到或者 access token 不可用则先更新再获取 * @return AccessToken accessToken */ public static AccessToken getAccessToken() { - if (accessToken!=null) - return accessToken; + if (accessTokenThreadLocal.get()!=null) { + return accessTokenThreadLocal.get(); + } + ApiConfig ac = ApiConfigKit.getApiConfig(); - AccessToken result = getAvailableAccessToken(ac); - if (result == null) { - synchronized(AccessTokenApi.class) { - result = getAvailableAccessToken(ac); - if (result == null) { - result = refreshAccessToken(ac); - } + AccessToken ak = getAvailableAccessToken(ac); + if (ak == null) { + ak = getAvailableAccessToken(ac); + if (ak == null) { + ak = refreshAccessToken(ac); } } - return result; + accessTokenThreadLocal.set(ak); + return ak; } private static AccessToken getAvailableAccessToken(ApiConfig ac) { // 利用 appId 与 accessToken 建立关联,支持多账户 IAccessTokenCache accessTokenCache = ApiConfigKit.getAccessTokenCache(); - String accessTokenJson = accessTokenCache.get(ac.getAppId()); if (StrKit.notBlank(accessTokenJson)) { AccessToken result = new AccessToken(accessTokenJson); + if (result != null && result.isAvailable()) { return result; } } + return null; } -- Gitee