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();
    }
}

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

时间: 2024-11-05 18:50:07

springboot 容器加载后自动监听 获取access_token的相关文章

[WPF自定义控件库] 让Form在加载后自动获得焦点

1. 需求 加载后让第一个输入框或者焦点是个很基本的功能,典型的如"登录"对话框.一般来说"登录"对话框加载后"用户名"应该马上获得焦点,用户只需输入用户名,点击Tab,再输入密码,点击回车就完成了登录操作. 在WPF中要让一个控件在加载时获得焦点应该很简单,只需要在Loaded事件后调用Focus()就行了.但有时表单是动态添加的,或者第一个表单元素会根据某些条件显示或隐藏,这时很难简单地让第一个控件获得焦点. 为了实现这个功能我创建了一个叫F

php命名空间自动加载后使用单独类include使用

普通的命名空间自动加载后,又对框架不熟,在M层或者C层想include直接调用第三方类时通常都不行会报错.原因是有命名空间和自动加载这两个php特性制约. 要解决这两个问题就只要两步即可,但当然在正规项目中不建议使用,要遵循MVC和PCR-0(1.只有一个入口文件:2.在类文件中不能使用直接实现方法的写法:3.命名空间与绝对路径一致)法则,这只是一个偏门技巧. 解决方法 在include文件后,用spl_autoload_unregister()把自动加载的函数注销掉: 如:spl_autolo

寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现。本文记录HAProxy服务热加载后某微服务50%概率失效的问题。设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加

寻找丢失的微服务-HAProxy热加载问题的发现与分析 原创: 单既喜 一点大数据技术团队 4月8日 在一点资讯的容器计算平台中,我们通过HAProxy进行Marathon服务发现.本文记录HAProxy服务热加载后某微服务50%概率失效的问题.设计3组对比实验,验证了陈旧配置的HAProxy在Reload时没有退出进而导致微服务丢失,并给出了解决方案. Keywords:HAProxy热加载.Marathon.端口重用 01 原文地址:https://www.cnblogs.com/yuanj

Tomcat:自动部署、自动重加载、自动编译

麻雀虽小,五脏俱全,Tomcat 提供的自动部署.自动重加载.自动编译功能,可谓是让人又爱又恨.接下来就对这三者做一个介绍,文章中会Copy一些官方文档中的说法. If you are using the standard Host implementation, the following actions take place automatically when Catalina is first started, if the deployOnStartup property is set

服务器重启后Oracle监听服务没有自动启动的解决方案

最近一直在被这样一个问题烦恼,就是服务器断电重启后,Oracle监听服务没有正常自动启动(监听服务已经设置为自启动). 具体是这样的,监听服务设置为开机自启动,Oracle数据库服务设置为开机延时启动,按道理这个应该符合“先启动监听,后启动数据库服务”这个条件,但是每次断电重启后都是数据库服务正常启动了,监听服务没能启动. 查阅了一下,有这么两个说法,感觉还是挺有道理: 1.一般设置了开机自启动的服务要手动,基本是注册表不一致造成: 2.登录账号跟你安装Oracle的账号不一样,没权限启动. 针

springMVC容器加载源码分析

springmvc是一个基于servlet容器的轻量灵活的mvc框架,在它整个请求过程中,为了能够灵活定制各种需求,所以提供了一系列的组件完成整个请求的映射,响应等等处理.这里我们来分析下springMVC的源码. 首先,spring提供了一个处理所有请求的servlet,这个servlet实现了servlet的接口,就是DispatcherServlet.把它配置在web.xml中,并且处理我们在整个mvc中需要处理的请求,一般如下配置: <servlet> <servlet-name

web应用启动的时候SpringMVC容器加载过程

<!-- 配置DispatcherServlet --> <servlet> <servlet-name>springmvc</servlet-name> <!-- DispatcherServlet类的全限定类名 --> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <init-param> &

页面加载后累加,自加1&amp;&amp;判断数字是否为两位数

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-

每日一题_JavaScript.两种方式实现网页加载后onload绑定多个函数?

具体需求: 1. 为网页加载后触发的onload事件绑定多个执行函数 实现思路: 1. 可直接给onload绑定一个匿名函数,匿名函数内部调用多个函数 2. 可自定义个函数,首先保存之前window.onload的值,然后判断window.onload的类型是否为function,如果不是就让window.onload的值设置为自定义的函数,否则就先执行window.onload之前绑定的函数,然后在执行自定义的函数 具体代码: <!DOCTYPE html> <html>