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 classTokenManager {private static final Logger logger = LoggerFactory.getLogger(this.getClass());private staticScheduledExecutorService scheduledExecutorService;private static Map tokenMap = new LinkedHashMap();private static Map> futureMap = new HashMap>();private static int poolSize = 2;private static boolean daemon =Boolean.TRUE;/**
* 初始化 scheduledExecutorService*/
private static voidinitScheduledExecutorService() {
logger.info("daemon:{},poolSize:{}", daemon, poolSize);
scheduledExecutorService= Executors.newScheduledThreadPool(poolSize, newThreadFactory() {
@OverridepublicThread newThread(Runnable arg0) {
Thread thread=Executors.defaultThreadFactory().newThread(arg0);//设置守护线程
thread.setDaemon(daemon);returnthread;
}
});
}/**
* 设置线程池
*
* @param poolSize poolSize*/
public static void setPoolSize(intpoolSize) {
BaiduTokenManager.poolSize=poolSize;
}/**
* 设置线程方式
*
* @param daemon daemon*/
public static voidsetDaemon(boolean daemon) {
BaiduTokenManager.daemon=daemon;
}/**
* 初始化token 刷新,每29天分钟刷新一次。
*
* @param access_token access_token*/
public static voidinit(final String apiKey, final String secretKey) {
init(apiKey, secretKey,0, 60 * 60 * 12 * 29);
}/**
* 初始化token 刷新,每29天分钟刷新一次。
*
* @param access_token access_token
* @param initialDelay 首次执行延迟(秒)
* @param delay 执行间隔(秒)*/
public static void init(final String apiKey, final String secretKey, int initialDelay, intdelay) {if (scheduledExecutorService == null) {
initScheduledExecutorService();
}if(futureMap.containsKey(apiKey)) {
futureMap.get(apiKey).cancel(true);
}//立即执行一次
if (initialDelay == 0) {
doRun(apiKey, secretKey);
}
ScheduledFuture> scheduledFuture = scheduledExecutorService.scheduleWithFixedDelay(newRunnable() {
@Overridepublic voidrun() {
doRun(apiKey, secretKey);
}
}, initialDelay== 0 ?delay : initialDelay, delay, TimeUnit.SECONDS);
futureMap.put(apiKey, scheduledFuture);
logger.info("apiKey:{}", apiKey);
}private static voiddoRun(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 voiddestroyed() {
scheduledExecutorService.shutdownNow();
logger.info("destroyed");
}/**
* 取消刷新
*
* @param access_token access_token*/
public static voiddestroyed(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 staticString getToken(String access_token) {return tokenMap.get(access_token);
}/**
* access_token
* @return token*/
public staticString getDefaultToken() {
Object[] objs=tokenMap.values().toArray();return objs.length > 0 ? objs[0].toString() : null;
}
}
该博客介绍了一个Java实现的TokenManager类,用于定时刷新API Token。TokenManager使用ScheduledExecutorService进行定时任务调度,每29天刷新一次。类中包含初始化、设置线程池大小、销毁以及获取Token的方法。
1747

被折叠的 条评论
为什么被折叠?



