springboot 容器加载后自动监听 获取access_token

本文介绍了一种基于Spring Boot的微信Access Token定时更新机制,通过自定义TokenThread线程和MyThreadRunner监听器实现自动刷新,确保了公众号接口调用的连续性和有效性。

问题来源:

  因为在项目中需要获取微信的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();
    }
}

 

转载于:https://www.cnblogs.com/pangyangqi/p/9473754.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值