主要用到了调度线程池: ScheduleExecutorService, 一个循环方法scheduleWithFixedDelay(方法执行完之后计算下一次开始执行时间)

使用

TokenManager.setDaemon(false);
TokenManager.init(apiKey, SecuretKey);

当然apiKey, SecuretKey 如果只有一个参数,可以自己修改

package com.gwzx.gwzxyw.baidu;

import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.concurrent.Executors;
import java.util.concurrent.ScheduledExecutorService;
import java.util.concurrent.ScheduledFuture;
import java.util.concurrent.ThreadFactory;
import java.util.concurrent.TimeUnit; import org.slf4j.Logger;
import org.slf4j.LoggerFactory; public class TokenManager { private static final Logger logger = LoggerFactory.getLogger(this.getClass()); private static ScheduledExecutorService scheduledExecutorService; private static Map<String, String> tokenMap = new LinkedHashMap<String, String>(); private static Map<String, ScheduledFuture<?>> futureMap = new HashMap<String, ScheduledFuture<?>>(); private static int poolSize = ; private static boolean daemon = Boolean.TRUE; /**
* 初始化 scheduledExecutorService
*/
private static void initScheduledExecutorService() {
logger.info("daemon:{},poolSize:{}", daemon, poolSize);
scheduledExecutorService = Executors.newScheduledThreadPool(poolSize, new ThreadFactory() { @Override
public Thread newThread(Runnable arg0) {
Thread thread = Executors.defaultThreadFactory().newThread(arg0);
//设置守护线程
thread.setDaemon(daemon);
return thread;
}
});
} /**
* 设置线程池
*
* @param poolSize poolSize
*/
public static void setPoolSize(int poolSize) {
BaiduTokenManager.poolSize = poolSize;
} /**
* 设置线程方式
*
* @param daemon daemon
*/
public static void setDaemon(boolean daemon) {
BaiduTokenManager.daemon = daemon;
} /**
* 初始化token 刷新,每29天分钟刷新一次。
*
* @param access_token access_token
*/
public static void init(final String apiKey, final String secretKey) {
init(apiKey, secretKey, , * * * );
} /**
* 初始化token 刷新,每29天分钟刷新一次。
*
* @param access_token access_token
* @param initialDelay 首次执行延迟(秒)
* @param delay 执行间隔(秒)
*/
public static void init(final String apiKey, final String secretKey, int initialDelay, int delay) {
if (scheduledExecutorService == null) {
initScheduledExecutorService();
} if (futureMap.containsKey(apiKey)) {
futureMap.get(apiKey).cancel(true);
}
//立即执行一次
if (initialDelay == ) {
doRun(apiKey, secretKey);
}
ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
@Override
public void run() {
doRun(apiKey, secretKey);
}
}, initialDelay == ? delay : initialDelay, delay, TimeUnit.SECONDS);
futureMap.put(apiKey, scheduledFuture);
logger.info("apiKey:{}", apiKey);
} private static void doRun(final String apiKey, final String secretKey) {
try {
String access_token = AuthService.getAuth(apiKey, secretKey); tokenMap.put(apiKey, access_token);
logger.info("access_token refurbish with apiKey:{}", apiKey);
} catch (Exception e) {
logger.error("access_token refurbish error with apiKey:{}", apiKey);
e.printStackTrace();
}
} /**
* 取消 token 刷新
*/
public static void destroyed() {
scheduledExecutorService.shutdownNow();
logger.info("destroyed");
} /**
* 取消刷新
*
* @param access_token access_token
*/
public static void destroyed(String access_token) {
if (futureMap.containsKey(access_token)) {
futureMap.get(access_token).cancel(true);
logger.info("destroyed appid:{}", access_token);
}
} /**
* 获取
* @param access_token access_token
* @return token
*/
public static String getToken(String access_token) {
return tokenMap.get(access_token);
} /**
* access_token
* @return token
*/
public static String getDefaultToken() {
Object[] objs = tokenMap.values().toArray();
return objs.length > ? objs[].toString() : null;
} }

Java API token定时刷新的更多相关文章

  1. Java进阶SQL函数、网页定时刷新与自定义JSTL函数

    一.SQL函数 能够在SQL语句中调用的函数(方法) ,用来实现一些小功能 聚合函数 能够把多行数据聚合成一个值(统计) count()    计数,计算数据条数 max()      计算最大值 m ...

  2. <微信应用开发系列>定时刷新AccessToken

    微信内嵌H5站一直很火,很多公司也想借助微信的用户群和社交群来做点事情,所以对于各位代码君来说也算是一个研究方向吧. access_token是公众号的全局唯一票据,公众号调用各接口时都需使用acce ...

  3. Elasticsearch 2.3.3 JAVA api说明文档

    原文地址:https://www.blog-china.cn/template\documentHtml\1484101683485.html 翻译作者:@青山常在人不老 加入翻译:cdcnsuper ...

  4. Hbase框架原理及相关的知识点理解、Hbase访问MapReduce、Hbase访问Java API、Hbase shell及Hbase性能优化总结

    转自:http://blog.csdn.net/zhongwen7710/article/details/39577431 本blog的内容包含: 第一部分:Hbase框架原理理解 第二部分:Hbas ...

  5. 应用JWT进行用户认证及Token的刷新

    本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及Token的刷新方案(ASP.NET Core 系列目录) 一.什么是JWT? JWT(json web token ...

  6. ASP.NET Core 2.2 : 二十六. 应用JWT进行用户认证及Token的刷新

    来源:https://www.cnblogs.com/FlyLolo/p/ASPNETCore2_26.html 本文将通过实际的例子来演示如何在ASP.NET Core中应用JWT进行用户认证以及T ...

  7. ASP.NET OAuth:解决refresh token无法刷新access token的问题

    最近同事用iOS App调用Open API时遇到一个问题:在access token过期后,用refresh token刷新access token时,服务器响应"invalid_gran ...

  8. 【jQuery】: 定时刷新页面

    <%@page import="qflag.ucstar.seatmonitor.manager.SeatMonitorManager"%><%@ page la ...

  9. Java API 快速速查宝典

    Java API 快速速查宝典 作者:明日科技,陈丹丹,李银龙,王国辉 著 出版社:人民邮电出版社 出版时间:2012年5月 Java编程的最基本要素是方法.属性和事件,掌握这些要素,就掌握了解决实际 ...

随机推荐

  1. 使用springfox+swagger2书写API文档(十八)

    使用springfox+swagger2书写API文档 springfox是通过注解的形式自动生成API文档,利用它,可以很方便的书写restful API,swagger主要用于展示springfo ...

  2. C语言中的可变参数函数

    C语言编程中有时会遇到一些参数个数可变的函数,例如printf()函数,其函数原型为: int printf( const char* format, ...); 它除了有一个参数format固定以外 ...

  3. IIS上部署DotNet Core程序

    1.安装托管捆绑包 https://docs.microsoft.com/zh-cn/aspnet/core/host-and-deploy/iis/index?view=aspnetcore-2.1 ...

  4. ajax下载,前端js下载(转)

    前面一直做过下载的功能.就是后台将文件流写入response里面,然后就好了.前台会自动弹出下载提示等. 今天打算做一个ajax下载.想当然的结果死活浏览器没反应.我擦. 然后浏览器调试,发现resp ...

  5. STL标准库-容器-unordered_set

    技术在于交流.沟通,本文为博主原创文章转载请注明出处并保持作品的完整性 unordered_set与与unordered_map相似,这次主要介绍unordered_set unordered_set ...

  6. kubernetes下的Nginx加Tomcat三部曲之三:实战扩容和升级

    本章是<kubernetes下的Nginx加Tomcat三部曲系列>的终篇,今天咱们一起在kubernetes环境对下图中tomcat的数量进行调整,再修改tomcat中web工程的源码, ...

  7. 20155318 2016-2017-2 《Java程序设计》第八学习总结

    20155318 2016-2017-2 <Java程序设计>第八学习总结 教材学习内容总结 学习目标 了解NIO 会使用Channel.Buffer与NIO2 会使用日志API.国际化 ...

  8. 使用python获取路径问题

    import sys curDir = sys.path[0] sys.path.append(curDir + '\\models') sys.path.append(curDir + '/mode ...

  9. 企业web管理软件开发平台

    可以自定义拖动记忆位置的part桌面 权限(功能菜单查看范围)设置界面 权限(人员数据查看范围)设置界面 菜单排序和名称设置界面 业务模块 自定义字段界面 业务功能  列表界面 业务功能   查询界面 ...

  10. PHP框架(如:laravel、yii2、thinkPHP5)中统一异常处理及统一日志打印

    背景: 现在写接口服务应用有一个很通用的需求,想通过日志.或者监控的形式监测的接口的运行情况,比如耗时.请求参数.响应结果.和前端联调接口时或者排查线上问题时日志必不可少,特别是现场日志. 应用运行时 ...