对象缓存错误调整

master
wangsq 3 years ago
parent 40ab0a4fb3
commit 68ca8f6e90
  1. 6
      src/main/java/com/ynxbd/push/controller/TestController.java
  2. 6
      src/main/java/com/ynxbd/push/entity/xbd/wx/AccessToken.java
  3. 65
      src/main/java/com/ynxbd/push/httpRequest/xbd/wx/WxCacheRequest.java

@ -1,6 +1,6 @@
package com.ynxbd.push.controller; package com.ynxbd.push.controller;
import com.ynxbd.push.config.IniConfig; import com.ynxbd.push.httpRequest.xbd.wx.WxCacheRequest;
import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController; import org.springframework.web.bind.annotation.RestController;
@ -11,8 +11,8 @@ public class TestController {
@GetMapping("test01") @GetMapping("test01")
public String test01() { public String test01() {
String id = IniConfig.test(); String accessToken = WxCacheRequest.getAccessToken();
System.out.println(id); System.out.println(accessToken);
return "success"; return "success";
} }
} }

@ -1,16 +1,16 @@
package com.ynxbd.push.entity.xbd.wx; package com.ynxbd.push.entity.xbd.wx;
import lombok.Data; import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable; import java.io.Serializable;
@Data @Data
public class RespAccessToken implements Serializable { @NoArgsConstructor
public class AccessToken implements Serializable {
private static final long serialVersionUID = 36888886677781604L; private static final long serialVersionUID = 36888886677781604L;
// 授权token // 授权token
private String accessToken; private String accessToken;
// 有效时间(s)
private Integer expiresIn;
// 创建时间 // 创建时间
private String createTime; private String createTime;
} }

@ -4,7 +4,7 @@ import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.JSONObject;
import com.ynxbd.push.config.EhCacheConfig; import com.ynxbd.push.config.EhCacheConfig;
import com.ynxbd.push.config.IniConfig; import com.ynxbd.push.config.IniConfig;
import com.ynxbd.push.entity.xbd.wx.RespAccessToken; import com.ynxbd.push.entity.xbd.wx.AccessToken;
import com.ynxbd.push.helper.DateHelper; import com.ynxbd.push.helper.DateHelper;
import com.ynxbd.push.helper.DesEncryptHelper; import com.ynxbd.push.helper.DesEncryptHelper;
import com.ynxbd.push.helper.RequestHelper; import com.ynxbd.push.helper.RequestHelper;
@ -14,18 +14,17 @@ import org.ehcache.Cache;
@Slf4j @Slf4j
public class WxCacheRequest { public class WxCacheRequest {
private static final String SERVICE_URL = "http://127.0.0.1:8080/wx/api/getWxAccessToken.do"; private static final String SERVICE_URL = "http://127.0.0.1:8080/wx/api/getWxAccessToken.do";
private static final String LOCALHOST_URL = "http://wx.mzsrmyy.net/wx/api/getWxAccessToken.do"; private static final String LOCALHOST_URL = "http://wx.hhzyy.com/wx/api/getWxAccessToken.do";
private static final int MAX_RETRY = 3; private static final int MAX_RETRY = 3;
static { static {
createAccessTokenCache(); createAccessTokenCache();
} }
// 缓存 // 缓存
private static Cache<String, RespAccessToken> ACCESS_TOKEN_CACHE; private static Cache<String, AccessToken> ACCESS_TOKEN_CACHE;
private static final String CACHE_NAME = "access_token"; private static final String CACHE_NAME = "access_token";
private static final long CACHE_TIME = 7100; private static final long CACHE_TIME = 7100;
@ -33,39 +32,51 @@ public class WxCacheRequest {
private synchronized static void createAccessTokenCache() { private synchronized static void createAccessTokenCache() {
if (ACCESS_TOKEN_CACHE == null) { if (ACCESS_TOKEN_CACHE == null) {
ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, RespAccessToken.class, "wx_access_token_cache", (CACHE_TIME)); // 一个半小时 ACCESS_TOKEN_CACHE = EhCacheConfig.createCacheTTL(String.class, AccessToken.class, "wx_access_token_cache", (CACHE_TIME)); // 一个半小时
} }
} }
public static String getAccessToken() { public static String getAccessToken() {
RespAccessToken respAccessToken = getWxAccessToken(); AccessToken accessToken = getWxAccessToken();
if (respAccessToken == null) { if (accessToken == null) {
return null; return null;
} }
return respAccessToken.getAccessToken(); return accessToken.getAccessToken();
} }
/** /**
* 获取微信token * 获取微信token
*/ */
private synchronized static RespAccessToken getWxAccessToken() { private synchronized static AccessToken getWxAccessToken() {
if (ACCESS_TOKEN_CACHE == null) { if (ACCESS_TOKEN_CACHE == null) {
createAccessTokenCache(); createAccessTokenCache();
} }
log.info("启动医院为:{}", IniConfig.getInstance("name")); log.info("启动医院为:{}", IniConfig.getInstance("name"));
try { try {
RespAccessToken respAccessToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME); AccessToken token = new AccessToken();
if (respAccessToken == null) { AccessToken cacheToken = ACCESS_TOKEN_CACHE.get(CACHE_NAME);
respAccessToken = againGetWxAccessToken(); if (cacheToken != null) {
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respAccessToken); if (7200 > DateHelper.differCurSecond(cacheToken.getCreateTime())) { // 允许100s的旧token存在(5分钟内可以继续使用佬)
return respAccessToken; AccessToken respToken = againGetWxAccessToken();
if (respToken != null) {
token.setAccessToken(respToken.getAccessToken());
token.setCreateTime(respToken.getCreateTime());
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken);
}
} else {
token.setAccessToken(cacheToken.getAccessToken());
token.setCreateTime(cacheToken.getCreateTime());
}
return token;
} }
if (7200 > DateHelper.differCurSecond(respAccessToken.getCreateTime())) { // 允许100s的旧token存在(5分钟内可以继续使用佬) AccessToken respToken = againGetWxAccessToken();
respAccessToken = againGetWxAccessToken(); if (respToken != null) {
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respAccessToken); token.setAccessToken(respToken.getAccessToken());
return respAccessToken; token.setCreateTime(respToken.getCreateTime());
ACCESS_TOKEN_CACHE.put(CACHE_NAME, respToken);
} }
return token;
} catch (Exception e) { } catch (Exception e) {
log.error("请求微信获取Token错误:{}", e.getMessage()); log.error("请求微信获取Token错误:{}", e.getMessage());
} }
@ -75,15 +86,15 @@ public class WxCacheRequest {
/** /**
* 根据次数循环获取 * 根据次数循环获取
*/ */
private static RespAccessToken againGetWxAccessToken() { private static AccessToken againGetWxAccessToken() {
RespAccessToken respAccessToken = null; AccessToken accessToken;
for (int i = 0; i < MAX_RETRY; i++) { for (int i = 0; i < MAX_RETRY; i++) {
respAccessToken = requestWxAccessToken(); accessToken = requestWxAccessToken();
if (i != 0) { if (i != 0) {
log.error("重试请求第{}次", (i + 1)); log.error("重试请求第{}次", (i + 1));
} }
if (respAccessToken != null) { if (accessToken != null) {
return respAccessToken; return accessToken;
} }
if ((i + 1) == MAX_RETRY) { if ((i + 1) == MAX_RETRY) {
log.error("{} 次请求后未获取到正确token", MAX_RETRY); log.error("{} 次请求后未获取到正确token", MAX_RETRY);
@ -96,9 +107,10 @@ public class WxCacheRequest {
/** /**
* 请求微信token * 请求微信token
*/ */
private static RespAccessToken requestWxAccessToken() { private static AccessToken requestWxAccessToken() {
try { try {
JSONObject respJson = RequestHelper.getJsonObj(SERVICE_URL, null); JSONObject respJson = RequestHelper.getJsonObj(LOCALHOST_URL, null);
log.info("[token请求]resp={}", respJson);
String code = respJson.getString("code"); String code = respJson.getString("code");
if (!"200".equals(code)) { if (!"200".equals(code)) {
log.info("请求token失败 code={}, message={}", code, respJson.getString("message")); log.info("请求token失败 code={}, message={}", code, respJson.getString("message"));
@ -108,7 +120,8 @@ public class WxCacheRequest {
if (data == null || "".equals(data)) { if (data == null || "".equals(data)) {
return null; return null;
} }
RespAccessToken resp = JSON.parseObject(data, RespAccessToken.class); AccessToken resp = JSON.parseObject(data, AccessToken.class);
System.out.println(resp);
if (resp == null) { if (resp == null) {
return null; return null;
} }

Loading…
Cancel
Save