소스 검색

🎨 #1294 优化getAccessToken方法,解决并发时重复刷新的问题

master
kennywgx 5 년 전
committed by Binary Wang
부모
커밋
dc89396ead
4개의 변경된 파일46개의 추가작업 그리고 0개의 파일을 삭제
  1. +3
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java
  2. +3
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java
  3. +3
    -0
      weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java
  4. +37
    -0
      weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java

+ 3
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceHttpClientImpl.java 파일 보기

@@ -74,6 +74,9 @@ public class WxMpServiceHttpClientImpl extends BaseWxMpServiceImpl<CloseableHttp
Lock lock = config.getAccessTokenLock(); Lock lock = config.getAccessTokenLock();
lock.lock(); lock.lock();
try { try {
if (!config.isAccessTokenExpired() && !forceRefresh) {
return config.getAccessToken();
}
String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret()); String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());
try { try {
HttpGet httpGet = new HttpGet(url); HttpGet httpGet = new HttpGet(url);


+ 3
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceJoddHttpImpl.java 파일 보기

@@ -59,6 +59,9 @@ public class WxMpServiceJoddHttpImpl extends BaseWxMpServiceImpl<HttpConnectionP
Lock lock = config.getAccessTokenLock(); Lock lock = config.getAccessTokenLock();
lock.lock(); lock.lock();
try { try {
if (!config.isAccessTokenExpired() && !forceRefresh) {
return config.getAccessToken();
}
String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret()); String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());


HttpRequest request = HttpRequest.get(url); HttpRequest request = HttpRequest.get(url);


+ 3
- 0
weixin-java-mp/src/main/java/me/chanjar/weixin/mp/api/impl/WxMpServiceOkHttpImpl.java 파일 보기

@@ -48,6 +48,9 @@ public class WxMpServiceOkHttpImpl extends BaseWxMpServiceImpl<OkHttpClient, OkH
Lock lock = config.getAccessTokenLock(); Lock lock = config.getAccessTokenLock();
lock.lock(); lock.lock();
try { try {
if (!config.isAccessTokenExpired() && !forceRefresh) {
return config.getAccessToken();
}
String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret()); String url = String.format(GET_ACCESS_TOKEN_URL.getUrl(config), config.getAppId(), config.getSecret());


Request request = new Request.Builder().url(url).get().build(); Request request = new Request.Builder().url(url).get().build();


+ 37
- 0
weixin-java-mp/src/test/java/me/chanjar/weixin/mp/api/impl/BaseWxMpServiceImplTest.java 파일 보기

@@ -1,6 +1,11 @@
package me.chanjar.weixin.mp.api.impl; package me.chanjar.weixin.mp.api.impl;


import com.google.common.collect.Sets;
import com.google.inject.Inject; import com.google.inject.Inject;
import java.util.Set;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;
import java.util.concurrent.TimeUnit;
import me.chanjar.weixin.common.api.WxConsts; import me.chanjar.weixin.common.api.WxConsts;
import me.chanjar.weixin.common.bean.WxNetCheckResult; import me.chanjar.weixin.common.bean.WxNetCheckResult;
import me.chanjar.weixin.common.error.WxErrorException; import me.chanjar.weixin.common.error.WxErrorException;
@@ -14,6 +19,7 @@ import org.testng.annotations.Test;
import java.util.Arrays; import java.util.Arrays;


import static org.assertj.core.api.Assertions.assertThat; import static org.assertj.core.api.Assertions.assertThat;
import static org.testng.Assert.assertEquals;
import static org.testng.Assert.assertFalse; import static org.testng.Assert.assertFalse;
import static org.testng.Assert.assertTrue; import static org.testng.Assert.assertTrue;


@@ -114,4 +120,35 @@ public class BaseWxMpServiceImplTest {
public void testShortUrl_with_exceptional_url() throws WxErrorException { public void testShortUrl_with_exceptional_url() throws WxErrorException {
this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123"); this.wxService.shortUrl("http://www.baidu.com/test?redirect_count=1&access_token=123");
} }

@Test
public void refreshAccessTokenDuplicatelyTest() throws InterruptedException {
// 测试多线程刷新accessToken时是否重复刷新
wxService.getWxMpConfigStorage().expireAccessToken();
final Set<String> set = Sets.newConcurrentHashSet();
Runnable r = new Runnable() {
@Override
public void run() {
try {
String accessToken = wxService.getAccessToken();
set.add(accessToken);
} catch (WxErrorException e) {
e.printStackTrace();
}
}
};

final int threadNumber = 10;
ExecutorService executorService = Executors.newFixedThreadPool(threadNumber);
for ( int i = 0; i < threadNumber; i++ ) {
executorService.submit(r);
}
executorService.shutdown();
boolean isTerminated = executorService.awaitTermination(15, TimeUnit.SECONDS);
System.out.println("isTerminated: " + isTerminated);
System.out.println("times of refreshing accessToken: " + set.size());

assertEquals(set.size(), 1);

}
} }

불러오는 중...
취소
저장