You've already forked FrameTour-BE
添加锁避免高并发冲突
This commit is contained in:
@ -8,6 +8,7 @@ import java.io.InputStream;
|
|||||||
import java.util.Date;
|
import java.util.Date;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.concurrent.ConcurrentHashMap;
|
import java.util.concurrent.ConcurrentHashMap;
|
||||||
|
import java.util.concurrent.locks.ReentrantLock;
|
||||||
|
|
||||||
public class WxMpUtil {
|
public class WxMpUtil {
|
||||||
private static final String GET_WXA_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode?access_token=%s";
|
private static final String GET_WXA_CODE_URL = "https://api.weixin.qq.com/wxa/getwxacode?access_token=%s";
|
||||||
@ -16,25 +17,31 @@ public class WxMpUtil {
|
|||||||
public static final String GET_USER_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s";
|
public static final String GET_USER_PHONE_URL = "https://api.weixin.qq.com/wxa/business/getuserphonenumber?access_token=%s";
|
||||||
private static final Map<String, String> tokens = new ConcurrentHashMap<>();
|
private static final Map<String, String> tokens = new ConcurrentHashMap<>();
|
||||||
private static final Map<String, Date> expireTimes = new ConcurrentHashMap<>();
|
private static final Map<String, Date> expireTimes = new ConcurrentHashMap<>();
|
||||||
|
private static final ReentrantLock lock = new ReentrantLock();
|
||||||
|
|
||||||
private static String getAccessToken(String appId, String appSecret) {
|
private static String getAccessToken(String appId, String appSecret) {
|
||||||
if (expireTimes.containsKey(appId)) {
|
lock.lock();
|
||||||
Date expireTime = expireTimes.get(appId);
|
try {
|
||||||
if (expireTime.getTime() < System.currentTimeMillis()) {
|
if (expireTimes.containsKey(appId)) {
|
||||||
|
Date expireTime = expireTimes.get(appId);
|
||||||
|
if (expireTime.getTime() < System.currentTimeMillis()) {
|
||||||
|
tokens.remove(appId);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
tokens.remove(appId);
|
tokens.remove(appId);
|
||||||
}
|
}
|
||||||
} else {
|
return tokens.computeIfAbsent(appId, (k) -> {
|
||||||
tokens.remove(appId);
|
String url = String.format(ACCESS_TOKEN_URL, appId, appSecret);
|
||||||
|
String response = HttpUtil.get(url);
|
||||||
|
JSONObject jsonObject = JSONObject.parseObject(response);
|
||||||
|
String token = jsonObject.getString("access_token");
|
||||||
|
Date expireTime = new Date(System.currentTimeMillis() + jsonObject.getInteger("expires_in") * 1000 / 2);
|
||||||
|
expireTimes.put(appId, expireTime);
|
||||||
|
return token;
|
||||||
|
});
|
||||||
|
} finally {
|
||||||
|
lock.unlock();
|
||||||
}
|
}
|
||||||
return tokens.computeIfAbsent(appId, (k) -> {
|
|
||||||
String url = String.format(ACCESS_TOKEN_URL, appId, appSecret);
|
|
||||||
String response = HttpUtil.get(url);
|
|
||||||
JSONObject jsonObject = JSONObject.parseObject(response);
|
|
||||||
String token = jsonObject.getString("access_token");
|
|
||||||
Date expireTime = new Date(System.currentTimeMillis() + jsonObject.getInteger("expires_in") * 1000 / 2);
|
|
||||||
expireTimes.put(appId, expireTime);
|
|
||||||
return token;
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void generateWXAQRCode(String appId, String appSecret, String envVersion, String path, String filePath) throws Exception {
|
public static void generateWXAQRCode(String appId, String appSecret, String envVersion, String path, String filePath) throws Exception {
|
||||||
|
Reference in New Issue
Block a user