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

使用

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

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

  1. package com.gwzx.gwzxyw.baidu;
  2.  
  3. import java.util.HashMap;
  4. import java.util.LinkedHashMap;
  5. import java.util.Map;
  6. import java.util.concurrent.Executors;
  7. import java.util.concurrent.ScheduledExecutorService;
  8. import java.util.concurrent.ScheduledFuture;
  9. import java.util.concurrent.ThreadFactory;
  10. import java.util.concurrent.TimeUnit;
  11.  
  12. import org.slf4j.Logger;
  13. import org.slf4j.LoggerFactory;
  14.  
  15. public class TokenManager {
  16.  
  17. private static final Logger logger = LoggerFactory.getLogger(this.getClass());
  18.  
  19. private static ScheduledExecutorService scheduledExecutorService;
  20.  
  21. private static Map<String, String> tokenMap = new LinkedHashMap<String, String>();
  22.  
  23. private static Map<String, ScheduledFuture<?>> futureMap = new HashMap<String, ScheduledFuture<?>>();
  24.  
  25. private static int poolSize = ;
  26.  
  27. private static boolean daemon = Boolean.TRUE;
  28.  
  29. /**
  30. * 初始化 scheduledExecutorService
  31. */
  32. private static void initScheduledExecutorService() {
  33. logger.info("daemon:{},poolSize:{}", daemon, poolSize);
  34. scheduledExecutorService = Executors.newScheduledThreadPool(poolSize, new ThreadFactory() {
  35.  
  36. @Override
  37. public Thread newThread(Runnable arg0) {
  38. Thread thread = Executors.defaultThreadFactory().newThread(arg0);
  39. //设置守护线程
  40. thread.setDaemon(daemon);
  41. return thread;
  42. }
  43. });
  44. }
  45.  
  46. /**
  47. * 设置线程池
  48. *
  49. * @param poolSize poolSize
  50. */
  51. public static void setPoolSize(int poolSize) {
  52. BaiduTokenManager.poolSize = poolSize;
  53. }
  54.  
  55. /**
  56. * 设置线程方式
  57. *
  58. * @param daemon daemon
  59. */
  60. public static void setDaemon(boolean daemon) {
  61. BaiduTokenManager.daemon = daemon;
  62. }
  63.  
  64. /**
  65. * 初始化token 刷新,每29天分钟刷新一次。
  66. *
  67. * @param access_token access_token
  68. */
  69. public static void init(final String apiKey, final String secretKey) {
  70. init(apiKey, secretKey, , * * * );
  71. }
  72.  
  73. /**
  74. * 初始化token 刷新,每29天分钟刷新一次。
  75. *
  76. * @param access_token access_token
  77. * @param initialDelay 首次执行延迟(秒)
  78. * @param delay 执行间隔(秒)
  79. */
  80. public static void init(final String apiKey, final String secretKey, int initialDelay, int delay) {
  81. if (scheduledExecutorService == null) {
  82. initScheduledExecutorService();
  83. }
  84.  
  85. if (futureMap.containsKey(apiKey)) {
  86. futureMap.get(apiKey).cancel(true);
  87. }
  88. //立即执行一次
  89. if (initialDelay == ) {
  90. doRun(apiKey, secretKey);
  91. }
  92. ScheduledFuture<?> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(new Runnable() {
  93. @Override
  94. public void run() {
  95. doRun(apiKey, secretKey);
  96. }
  97. }, initialDelay == ? delay : initialDelay, delay, TimeUnit.SECONDS);
  98. futureMap.put(apiKey, scheduledFuture);
  99. logger.info("apiKey:{}", apiKey);
  100. }
  101.  
  102. private static void doRun(final String apiKey, final String secretKey) {
  103. try {
  104. String access_token = AuthService.getAuth(apiKey, secretKey);
  105.  
  106. tokenMap.put(apiKey, access_token);
  107. logger.info("access_token refurbish with apiKey:{}", apiKey);
  108. } catch (Exception e) {
  109. logger.error("access_token refurbish error with apiKey:{}", apiKey);
  110. e.printStackTrace();
  111. }
  112. }
  113.  
  114. /**
  115. * 取消 token 刷新
  116. */
  117. public static void destroyed() {
  118. scheduledExecutorService.shutdownNow();
  119. logger.info("destroyed");
  120. }
  121.  
  122. /**
  123. * 取消刷新
  124. *
  125. * @param access_token access_token
  126. */
  127. public static void destroyed(String access_token) {
  128. if (futureMap.containsKey(access_token)) {
  129. futureMap.get(access_token).cancel(true);
  130. logger.info("destroyed appid:{}", access_token);
  131. }
  132. }
  133.  
  134. /**
  135. * 获取
  136. * @param access_token access_token
  137. * @return token
  138. */
  139. public static String getToken(String access_token) {
  140. return tokenMap.get(access_token);
  141. }
  142.  
  143. /**
  144. * access_token
  145. * @return token
  146. */
  147. public static String getDefaultToken() {
  148. Object[] objs = tokenMap.values().toArray();
  149. return objs.length > ? objs[].toString() : null;
  150. }
  151.  
  152. }

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. IIS网页GZIP压缩

    1.开GZIP有什么好处? 答:Gzip开启以后会将输出到用户浏览器的数据进行压缩的处理,这样就会减小通过网络传输的数据量,提高浏览的速度. 2.如何启用IIS的Gzip压缩功能: 答:首先,如果你需 ...

  2. cvs的规范以及介绍(转)

    原文链接:http://blog.csdn.net/zlzlei/article/details/9236403 1. CSV的全称是叫Comma Separated Value 2. CSV的MIM ...

  3. Window 7 平台的IE11浏览器预览版发布

    继之前Windows 8.1 带来了IE11浏览器之后,今天Window 7 以及Windows Server 2008 R2平台的IE11浏览器预览版也已经发布. 当然这还只是一个开发者预览版,可能 ...

  4. git 忽略不提交的文件3种情形

    1..gitignore文件 :从未提交过的文件,从来没有被 Git 记录过的文件 也就是添加之后从来没有提交(commit)过的文件,可以使用.gitignore忽略该文件.只能作用于未跟踪的文件( ...

  5. New Concept English Two 7

    $课文14 你会讲英语吗? 133. I had an amusing experience last year. 去年我有过一次有趣的经历. 134. After I had left a smal ...

  6. vue.js 源代码学习笔记 ----- codegen.js

    /* @flow */ import { genHandlers } from './events' import { baseWarn, pluckModuleFunction } from '.. ...

  7. Linux运维学习笔记-定时任务知识总结

    定时任务编辑规范流程: 重要知识点: 切记用全路径编写定时脚本.定时任务 大部分在 crontab 计划任务中都会年到未尾带 >/dev/null 2>&1,是什么意思呢? > ...

  8. [QT]加快qt编译:设置默认多核编译qt

    使用环境:win7 + QT Creator 4.2.1 + QT5.8 + MinGW5.3.0 32bit 设置默认多核编译qt  来源:http://stackoverflow.com/ques ...

  9. CF1143D/1142A The Beatles

    CF1143D/1142A The Beatles 将题目中所给条件用同余方程表示,可得 \(s-1\equiv \pm a,s+l-1\equiv \pm b\mod k\). 于是可得 \(l\e ...

  10. webapi 文件下载输出接口

    public async ask<HttpResponseMessage> GetGuidingPrincipleDownload(string name ) { bool status ...