最近有一个项目,是使用萤石开放平台获取一些数据。但是遇到一个问题:获取到的AccessToken有效期只有7天,也就是说,每隔7天就要获取一次accessToken。
那么问题就来了:当一个项目部署之后,我们不可能在使用人工去获取accessToken,只能通过代码自动定时获取accessToken。那么怎样去自动获取?
对于自动获取accessToken,我们想到了使用多线程去获取AccessToken。具体思路:
1.写一个线程,在线程中实现定时获取accessToken。代码如下:
public class GetAccessTokenThread extends Thread { @Override public void run() { String appKey = "*********"; String appSecret = "**********"; GetToken getToken = new GetToken(appKey,appSecret);//GetToken是自己的获取getToken的类 TokenPojo token = new TokenPojo();//TokenPojo在下面代码中介绍 while (true) { try { BasicResponse<AccessToken> response = getToken.executeApi(); token.setAccessToken(response.getData().getAccessToken()); System.out.println("token="+token.getAccessToken()); Thread.sleep("设置每个多少毫秒请求一次"); } catch (InterruptedException e) { e.printStackTrace(); } } } }其中的TokenPojo类是我用于保存accessToken的类。其中的accessToken变量设置成了static。因为这样是因为accessToken变量就属于类了,为所有对象所共有。这样就不用去设置单独的数据库或者缓存去存储accessToken的值(因为只有一个变量)。
代码如下:
public class TokenPojo { private static String accessToken = "at.38s4iyczacw2eet7b3yyubgl912t0pz1-2rsetdrwx6-1xeqgcb-fvpvhhoev"; public String getAccessToken() { return accessToken; } public void setAccessToken(String accessToken) { this.accessToken = accessToken; } }2. 写一个servlet去开启这个线程。
public class initServlet extends HttpServlet { @Override public void init() throws ServletException { System.out.println("************初始化initServlet****************"); Thread getTokenThread = new GetAccessTokenThread(); getTokenThread.start(); super.init(); } }3. 在web.xml中去配置servlet,设置成启动tomcat时就启动该线程,然后每个一定时间就会去执行一个该线程(自动获取一次请求得到accessToken)
<!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd" > <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" version="3.1"> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class>com.wsn.restful.servlet.initServlet</servlet-class> <load-on-startup>1</load-on-startup> </servlet> </web-app>
大概思路使用图解方式去理解:
其实:tomcat启动时,后台自动启动一个线程的方式有很多种:一种是listener,另外一种是servlet(也就是本文采用的方法)。其他方法可以参考:http://blog.sina.com.cn/s/blog_6810dfc20101ipzq.html