RefreshAccessTokenScheduler.java 3.0 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. package com.ematou.wxbase.scheduler;
  2. import com.ematou.wxbase.common.utils.DateUtils;
  3. import com.ematou.wxbase.entity.TokenRecord;
  4. import com.ematou.wxbase.service.TokenRecordService;
  5. import org.slf4j.Logger;
  6. import org.slf4j.LoggerFactory;
  7. import org.springframework.beans.factory.annotation.Autowired;
  8. import org.springframework.scheduling.annotation.EnableScheduling;
  9. import org.springframework.scheduling.annotation.Scheduled;
  10. import org.springframework.stereotype.Component;
  11. import org.springframework.util.CollectionUtils;
  12. import java.text.ParseException;
  13. import java.util.Date;
  14. import java.util.List;
  15. import java.util.stream.Collectors;
  16. /**
  17. * @author lhm
  18. * @version 1.0
  19. * 2021-05-06 15:50
  20. */
  21. @Component
  22. @EnableScheduling
  23. public class RefreshAccessTokenScheduler {
  24. private static final Logger logger = LoggerFactory.getLogger(RefreshAccessTokenScheduler.class);
  25. @Autowired
  26. TokenRecordService tokenRecordService;
  27. /**
  28. * 定时器刷新token
  29. */
  30. @Scheduled(cron = "0 0 0/2 * * ?", zone = "Asia/Shanghai")
  31. public void refreshAccessToken() {
  32. try {
  33. logger.info("定时器开始刷新Token...");
  34. tokenRecordService.generateToken();
  35. } catch (Exception e) {
  36. logger.error("定时刷新Token失败!errorMessage: " + e.getMessage());
  37. }
  38. }
  39. /**
  40. * 扫描数据库中失效的token,修改其状态(is_valid)为1
  41. */
  42. @Scheduled(cron = "0 3 0/2 * * ?", zone = "Asia/Shanghai")
  43. public void scanExpiryToken() {
  44. logger.info("开始扫描库中中失效的token记录......");
  45. int count = tokenRecordService.queryLatestAndValidRecordCount();
  46. if (count >= 1) {
  47. // 有生效的token,查询这些token,计算它们的过期时间,并修改已过期的token的状态为已失效
  48. List<TokenRecord> tokenRecords = tokenRecordService.queryTokenIsValid();
  49. if (CollectionUtils.isEmpty(tokenRecords)) {
  50. return;
  51. }
  52. // 需要更新的记录的id数组
  53. List<Integer> resultList = tokenRecords.stream().filter(tokenRecord -> {
  54. // 计算是否需要修改状态,这里对比一下失效时间和当前时间差多少时间即可
  55. String expiresTime = tokenRecord.getExpiresTime();
  56. Date tokenExpiresTime;
  57. try {
  58. tokenExpiresTime = DateUtils.parseString(expiresTime);
  59. } catch (ParseException e) {
  60. logger.error("时间转换失败!errorMessage: " + e.getMessage());
  61. return false;
  62. }
  63. Date now = new Date();
  64. long diff = now.getTime() - tokenExpiresTime.getTime();
  65. // 失效时间后3分钟置为失效token
  66. return diff >= (3 * 60 * 1000);
  67. }).map(TokenRecord::getId).collect(Collectors.toList());
  68. // 批量更新
  69. tokenRecordService.updateBatchRecord(resultList);
  70. logger.info("批量更新token状态成功!");
  71. }
  72. }
  73. }