MemberSysAccessTokenRefreshTask.java 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113
  1. package com.kmall.admin.haikong.task;
  2. import com.fasterxml.jackson.core.type.TypeReference;
  3. import com.kmall.admin.haikong.client.HaiKongMemberTemplate;
  4. import com.kmall.admin.haikong.constant.Constants;
  5. import com.kmall.admin.haikong.dto.AccessTokenDTO;
  6. import com.kmall.admin.haikong.utils.Response;
  7. import com.kmall.admin.utils.jackson.JacksonUtil;
  8. import com.kmall.manager.manager.redis.JedisUtil;
  9. import org.slf4j.Logger;
  10. import org.slf4j.LoggerFactory;
  11. import org.springframework.beans.factory.annotation.Autowired;
  12. import org.springframework.scheduling.annotation.Scheduled;
  13. import org.springframework.stereotype.Component;
  14. import org.springframework.util.StringUtils;
  15. import java.io.IOException;
  16. import java.util.Objects;
  17. import java.util.Optional;
  18. /**
  19. * 刷新会员系统token定时任务
  20. * @author lhm
  21. * @createDate 2021-10-30
  22. */
  23. @Component
  24. public class MemberSysAccessTokenRefreshTask {
  25. private static final Logger log = LoggerFactory.getLogger(MemberSysAccessTokenRefreshTask.class);
  26. @Autowired
  27. private HaiKongMemberTemplate haiKongMemberTemplate;
  28. // @Scheduled(cron = "0 55 0/2 * * ?")
  29. @Scheduled(cron = "0 0/2 * * * ?")
  30. public void refresh() {
  31. String refreshToken = JedisUtil.get(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
  32. String accessToken = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
  33. if (!StringUtils.isEmpty(refreshToken) && !StringUtils.isEmpty(accessToken)) {
  34. return;
  35. }
  36. boolean a = false;
  37. if (StringUtils.isEmpty(refreshToken)) {
  38. try {
  39. log.info("accessToken和refreshToken缓存都为空!开始刷新缓存......");
  40. String accessTokenJson = haiKongMemberTemplate.getAccessToken();
  41. a = true;
  42. handleResponse(accessTokenJson, a);
  43. log.info("accessToken和refreshToken缓存都为空!刷新缓存完成......");
  44. } catch (Exception e) {
  45. log.error(e.getMessage() + "====>", e);
  46. }
  47. } else {
  48. try {
  49. String refreshAccessTokenJson = haiKongMemberTemplate.refreshAccessToken(refreshToken);
  50. handleResponse(refreshAccessTokenJson, a);
  51. } catch (Exception e) {
  52. log.error(e.getMessage() + "====>", e);
  53. }
  54. }
  55. }
  56. private void handleResponse(String json, Boolean a) {
  57. Response<AccessTokenDTO> response = null;
  58. try {
  59. response = JacksonUtil.getObjectMapper().readValue(json, new TypeReference<Response<AccessTokenDTO>>() {
  60. });
  61. } catch (IOException e) {
  62. log.error("解析海控会员系统响应结果失败!", e);
  63. return;
  64. }
  65. if (Objects.nonNull(response) && response.getSuccess()) {
  66. AccessTokenDTO accessTokenDTO = response.getData();
  67. JedisUtil.del(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
  68. JedisUtil.set(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY, JacksonUtil.toJson(accessTokenDTO), (60 * 60 * 2) - (60 * 2));
  69. if (a) {
  70. JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
  71. JedisUtil.set(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY, Optional.ofNullable(accessTokenDTO.getRefreshToken()).orElse(""), (60 * 60 * 24 * 7));
  72. }
  73. } else if (Objects.nonNull(response) && !response.getSuccess() && Response.ErrorCodeEnum.INVALID_REFRESH.getErrorCode().equals(response.getErrorCode())) {
  74. log.info("海控会员系统RefreshToken已失效,重新获取AccessToken与RefreshToken!");
  75. JedisUtil.del(Constants.MEMBER_SYS_REFRESH_TOKEN_REDIS_KEY);
  76. refresh();
  77. } else {
  78. log.error("请求海控会员系统AccessToken返回响应为空!");
  79. }
  80. }
  81. public String getAccessToken() throws Exception {
  82. String accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
  83. if (StringUtils.isEmpty(accessTokenJson)) {
  84. refresh();
  85. accessTokenJson = JedisUtil.get(Constants.MEMBER_SYS_ACCESS_TOKEN_REDIS_KEY);
  86. AccessTokenDTO accessTokenDTO = JacksonUtil.fromStringJson(accessTokenJson, AccessTokenDTO.class);
  87. if (Objects.isNull(accessTokenDTO)) {
  88. log.error("accessToken数据转为对象失败!");
  89. throw new Exception("accessToken数据转为对象失败!");
  90. }
  91. return accessTokenDTO.getAccessToken();
  92. } else {
  93. AccessTokenDTO accessTokenDTO = JacksonUtil.fromStringJson(accessTokenJson, AccessTokenDTO.class);
  94. if (Objects.isNull(accessTokenDTO)) {
  95. log.error("accessToken数据转为对象失败!");
  96. throw new Exception("accessToken数据转为对象失败!");
  97. }
  98. return accessTokenDTO.getAccessToken();
  99. }
  100. }
  101. }