zoukankan      html  css  js  c++  java
  • springboot 容器加载后自动监听 获取access_token

    问题来源:

      因为在项目中需要获取微信的access_token ,access_token是公众号的全局唯一接口调用凭据,公众号调用各接口时都需使用access_token。开发者需要进行妥善保存。access_token的存储至少要保留512个字符空间。access_token的有效期目前为2个小时,需定时刷新,重复获取将导致上次获取的access_token失效。

      所以需要一个线程,来定时获取和更新access_token 

    一 新建 TokenThread 线程

    package com.hmzj.callcenterim.thread;
    
    import com.hmzj.callcenterim.dto.AccessToken;
    import com.hmzj.callcenterim.enums.WeixinEnum;
    import com.hmzj.callcenterim.utils.WeixinUtil;
    import lombok.extern.slf4j.Slf4j;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.cloud.context.config.annotation.RefreshScope;
    import org.springframework.data.redis.core.RedisTemplate;
    import org.springframework.stereotype.Service;
    
    /**
     * 定时获取和更新access_token
     * 
     * @author Yangqi.Pang
     * @version V0.0.1
     */
    @Service
    @Slf4j
    @RefreshScope
    public class TokenThread implements Runnable{
    
        private RedisTemplate<String, String> redisTemplate;
    
    
        @Autowired
        public TokenThread(RedisTemplate<String, String> redisTemplate) {
            this.redisTemplate = redisTemplate;
        }
    
        @Override
        public void run() {
            while (true) {
                try {
                    AccessToken accessToken = WeixinUtil.getAccessToken(WeixinEnum.APP_ID.getValue(), WeixinEnum.APP_SECRET.getValue());
                    if (accessToken != null) {
                        if (accessToken.getToken() != null) {
                            redisTemplate.opsForValue().set("accessToken", accessToken.getToken());
                            log.info("获取的accessToken为"+accessToken.getToken());
                        }
                    }
                    if (null != accessToken.getToken()) {
                        // 休眠7000秒
                        Thread.sleep((accessToken.getExpiresIn() - 3000) * 1000);
                    } else {
                        // 如果access_token为null,60秒后再获取
                        Thread.sleep(3600 * 1000);
                    }
                } catch (InterruptedException e) {
                    try {
                        Thread.sleep(60 * 1000);
                    } catch (InterruptedException e1) {
                        log.error("{}", e1);
                    }
                    log.error("{}", e);
                }
    
            }
    
        }
    }

    二 配置监听器

    package com.hmzj.callcenterim;
    
    import com.hmzj.callcenterim.thread.TokenThread;
    import org.springframework.beans.factory.annotation.Autowired;
    import org.springframework.boot.CommandLineRunner;
    import org.springframework.stereotype.Component;
    /**
     * spring boot 容器加载后自动监听
     * 执行 tokenThread 线程
     *
     * @author Yangqi.pang
     * @version V0.0.1
     */
    
    @Component
    public class MyThreadRunner implements CommandLineRunner {
    
        @Autowired
        private TokenThread tokenThread;
    
        @Override
        public void run(String... args) {
            new Thread(tokenThread).start();
        }
    }

  • 相关阅读:
    悲观锁、乐观锁、行级锁、表级锁
    MySQL中锁详解(行锁、表锁、页锁、悲观锁、乐观锁等)
    刷题-力扣-148. 排序链表
    刷题-力扣-206. 反转链表
    刷题-力扣-203. 移除链表元素
    刷题-力扣-474. 一和零
    刷题-力扣-494. 目标和
    刷题-力扣-160. 相交链表
    刷题-力扣-34. 在排序数组中查找元素的第一个和最后一个位置
    刷题-力扣-33. 搜索旋转排序数组
  • 原文地址:https://www.cnblogs.com/pangyangqi/p/9473754.html
Copyright © 2011-2022 走看看