package com.kmall.admin.haikong.task; import com.fasterxml.jackson.core.type.TypeReference; import com.kmall.admin.haikong.client.HaiKongMemberTemplate; import com.kmall.admin.haikong.constant.Constants; import com.kmall.admin.haikong.dto.AccessTokenDTO; import com.kmall.admin.haikong.utils.Response; import com.kmall.admin.utils.jackson.JacksonUtil; import com.kmall.manager.manager.redis.JedisUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; import org.springframework.stereotype.Component; import org.springframework.util.StringUtils; import java.io.IOException; import java.util.Objects; import java.util.Optional; /** * 刷新会员系统token定时任务 * @author lhm * @createDate 2021-10-30 */ @Component public class MemberSysAccessTokenRefreshTask { private static final Logger log = LoggerFactory.getLogger(MemberSysAccessTokenRefreshTask.class); @Autowired private HaiKongMemberTemplate haiKongMemberTemplate; @Scheduled(cron = "0/30 * * * * ?") public void refresh() { String refreshToken = JedisUtil.get(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY); String accessToken = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY); // if (!StringUtils.isEmpty(refreshToken) && !StringUtils.isEmpty(accessToken)) { // return; // } boolean a = false; if (StringUtils.isEmpty(refreshToken)) { try { log.info("accessToken和refreshToken缓存都为空!开始刷新缓存......"); String accessTokenJson = haiKongMemberTemplate.getAccessToken(); a = true; handleResponse(accessTokenJson, a); log.info("accessToken和refreshToken缓存都为空!刷新缓存完成......"); } catch (Exception e) { log.error(e.getMessage() + "====>", e); } } else if (!StringUtils.isEmpty(refreshToken)) { try { String refreshAccessTokenJson = haiKongMemberTemplate.refreshAccessToken(refreshToken); handleResponse(refreshAccessTokenJson, a); } catch (Exception e) { log.error(e.getMessage() + "====>", e); } } } private void handleResponse(String json, Boolean a) { Response response = null; try { response = JacksonUtil.getObjectMapper().readValue(json, new TypeReference>() { }); } catch (IOException e) { log.error("解析海控会员系统响应结果失败!", e); return; } if (Objects.nonNull(response) && response.getSuccess()) { AccessTokenDTO accessTokenDTO = response.getData(); JedisUtil.del(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY); JedisUtil.set(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY, JacksonUtil.toJson(accessTokenDTO), (60 * 60 * 2) - (60 * 10)); if (a) { JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY); JedisUtil.set(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY, Optional.ofNullable(accessTokenDTO.getRefreshToken()).orElse(""), (60 * 60 * 24 * 7)); } } else if (Objects.nonNull(response) && !response.getSuccess() && Response.ErrorCodeEnum.INVALID_REFRESH.getErrorCode().equals(response.getErrorCode())) { log.info("海控会员系统RefreshToken已失效,重新获取AccessToken与RefreshToken!"); JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY); refresh(); } else { log.error("请求海控会员系统AccessToken返回响应为空!"); } } public String getAccessToken() throws Exception { String accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY); if (StringUtils.isEmpty(accessTokenJson)) { refresh(); accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY); AccessTokenDTO accessTokenDTO = JacksonUtil.fromStringJson(accessTokenJson, AccessTokenDTO.class); if (Objects.isNull(accessTokenDTO)) { log.error("accessToken数据转为对象失败!"); throw new Exception("accessToken数据转为对象失败!"); } return accessTokenDTO.getAccessToken(); } else { AccessTokenDTO accessTokenDTO = JacksonUtil.fromStringJson(accessTokenJson, AccessTokenDTO.class); if (Objects.isNull(accessTokenDTO)) { log.error("accessToken数据转为对象失败!"); throw new Exception("accessToken数据转为对象失败!"); } return accessTokenDTO.getAccessToken(); } } }