java在固定时间内取值
2014-05-09 16:39
197 查看
场景:在微信中,开发者在调用api接口时,都需要传入一个相同的参数access_token,这个参数是通过微信公众号的帐号和密码来获取,它是全局唯一票据,有效期是7200秒(两小时),在有效期内可以一直使用,只有当它过期时,才需要再次调用。如果在有效期内再次获取access_token,那么上一次获取的将失效,目前,获取access_token接口的调用频率限制为2000次/天。如果一天中过于频繁获取它,一方面很费时,另外2000次/天也恐怕不够用。
引申思考: 如何让一个对象的值在某一个时间段都有效,类似缓存效果,即不希望这个对象老是在变。
首先声明这个对象
最后写一个servlet,让线程跑起来
运行它,可以得到我们想要的结果,在每一个十秒的时间段内,name的值是不会发生变化的。
本文思路源于柳峰的《微信开发:如何使得accessToken长期有效》,是对其一种简化实现。
附上自己的一个错误,在调试该功能的时候,曾反复的在main主入口调用ValueThread.person.getName()企图能看到效果,这样当然会被空指针一轮轮的虐了,其实这应该算是一个常识性的问题,单独的java类当然不能与在Tomcat容器中运行的类互动了。
引申思考: 如何让一个对象的值在某一个时间段都有效,类似缓存效果,即不希望这个对象老是在变。
首先声明这个对象
class Person { private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } }然后写一个线程
import java.util.UUID; public class ValueThread implements Runnable { public static Person person = null; @Override public void run() { while (true) { person = new Person(); //给person的name设置为一个随机字符串 person.setName(UUID.randomUUID()+""); try { //线程睡眠10秒钟 Thread.sleep(10 * 1000); } catch (InterruptedException e) { e.printStackTrace(); } } } }
最后写一个servlet,让线程跑起来
import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class InitServlet extends HttpServlet{ private static final long serialVersionUID = 1L; @Override public void init() throws ServletException { new Thread(new ValueThread()).start(); } @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取name并将其返回到页面 req.setAttribute("name", ValueThread.person.getName()); req.getRequestDispatcher("index.jsp").forward(req, resp); } }servlet配置:
<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> <servlet> <servlet-name>initServlet</servlet-name> <servlet-class>com.test.InitServlet</servlet-class> <load-on-startup>0</load-on-startup> </servlet> <servlet-mapping> <servlet-name>initServlet</servlet-name> <url-pattern>/get</url-pattern> </servlet-mapping>index.jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title>index page</title> </head> <body> <%=request.getAttribute("name") %><br> <a href="get">取值</a> </body> </html>
运行它,可以得到我们想要的结果,在每一个十秒的时间段内,name的值是不会发生变化的。
本文思路源于柳峰的《微信开发:如何使得accessToken长期有效》,是对其一种简化实现。
附上自己的一个错误,在调试该功能的时候,曾反复的在main主入口调用ValueThread.person.getName()企图能看到效果,这样当然会被空指针一轮轮的虐了,其实这应该算是一个常识性的问题,单独的java类当然不能与在Tomcat容器中运行的类互动了。
相关文章推荐
- java Timer(定时调用、实现固定时间执行)
- java Timer(定时调用、实现固定时间执行)
- java通过封装编写Book类。要求:类具有属性书名、书号、主编、出版社、出版时间、页数、价格,其中页数不能少于200页,否则输出错误信息,并强制赋默认值200;为各属性设置赋值和取值方法;具有方法d
- java编程题:将某个时间以固定格式转化成字符串
- java Timer测试定时调用及固定时间执行代码示例
- 关于Java Web 使用Spring中使用Quartz(定时调用、实现固定时间执行), 触发定时器(执行某些任务)的实例
- java Timer(定时调用、实现固定时间执行)
- java Timer(定时调用、实现固定时间执行)
- java.util.timer每天 在固定时间
- java.util.timer每天 在固定时间
- 使用新的java线程池技术创建固定的线程去完成任务,都完成后计算总时间
- java Timer(定时调用、实现固定时间执行)
- java定时器-固定时间间隔内执行操作
- 【Java】SpringMVC项目利用Shiro设置固定时间内密码登录重试次数限制
- java Timer(定时调用、实现固定时间执行)
- java 定时器,固定某个时间执行(Spring+Quartz实现定时任务的配置方法)
- JAVA DATE解析(时间戳解析为固定格式)
- MySql与Java的时间类型
- java中oracle语句的时间表示
- Java本地时间与GMT时间的转换