码迷,mamicode.com
首页 > 数据库 > 详细

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

时间:2018-08-14 14:36:25      阅读:1017      评论:0      收藏:0      [点我收藏+]

标签:图片   lse   cto   ice   run   interrupt   str   contex   存储   

问题来源:

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

技术分享图片

 

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

标签:图片   lse   cto   ice   run   interrupt   str   contex   存储   

原文地址:https://www.cnblogs.com/pangyangqi/p/9473754.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!