最近在做微信开发,网上资料一大堆,但是要在原来的pc代码上修改则需要修改部分代码才能实现两台服务器之间的完美通信,今天写一下关于微信token的更新。
满足条件:token随时能用,本地获取,向微信服务器请求次数不会超过限制。
思路:采用定时器每隔2小时向微信请求一次并把结果保存到数据库中,定时器在系统启动后开始运行。
java代码,tomcat7
监听器代码:
package gbkj.listener;
import gbkj.weixin.util.CommonUtil;
import gbkj.weixin.util.ParamesAPI;
import java.util.Timer;
import java.util.TimerTask;
import javax.servlet.ServletContext;
import javax.servlet.ServletContextEvent;
import javax.servlet.ServletContextListener;
import com.gb.sysmodule.model.base.Ticket;
import com.gb.sysmodule.model.base.Token;
import com.gb.sysmodule.service.SpringUtil;
import com.gb.sysmodule.service.base.TicketServiceI;
import com.gb.sysmodule.service.base.TokenServiceI;
/**
* 后台定时任务:刷新access_token和tickect
*
* @author liuxiong
*
*/
public class MyContextListener implements ServletContextListener{//xml中声明此监听
private TokenServiceI tokenService;
private TicketServiceI ticketService;
private ServletContext context = null;//web应用
private Timer timer = null;
public MyContextListener() {
super();
}
/**
* 两小时执行一次刷新,考虑网络延迟,实际时间会更短
*/
@Override
public void contextInitialized(ServletContextEvent sce) {
this.context = sce.getServletContext();//获取当前应用
timer = new java.util.Timer(true);//相关线程为守护程序
sce.getServletContext().log("定时器已启动");
long delay1 = 1000;//tomcat启动后1秒开始执行
long period = 7140000;//每隔1小时59分执行一次
timer.schedule(new MyTask(this.context), delay1, period);//(任务,延迟,间隔)
sce.getServletContext().log("已经添加任务调度表");
}
public void getService() {
if (tokenService==null) {
tokenService = (TokenServiceI)SpringUtil.getBean("tokenService");
}
if (ticketService==null) {
ticketService = (TicketServiceI)SpringUtil.getBean("ticketService");
}
freshToken();
freshTicket();
}
@Override
public void contextDestroyed(ServletContextEvent sce) {
timer.cancel();
this.context.log("定时器销毁");
this.context = null;
}
public void freshToken() {
Token token = CommonUtil.getToken(ParamesAPI.corpId, ParamesAPI.corpsecret);
if (token!=null) {
tokenService.saveOrUpdate(token);
context.log("更新token成功!");
}else {
context.log("获取token失败!");
}
}
public void freshTicket() {
Token token = tokenService.getByHql("from Token");
if (token!=null) {
Ticket ticket = CommonUtil.getTicket(token);
if (ticket!=null) {
ticketService.saveOrUpdate(ticket);
context.log("更新ticket成功!");
return;
}
}
context.log("获取ticket失败!");
}
private class MyTask extends TimerTask {
private ServletContext context = null;
public MyTask(ServletContext context) {
this.context = context;
}
// 下面的方法会按之前设定的每5秒执行一次,所以,此处不需要循环
public void run() {
context.log("开始执行更新任务");
getService();
context.log("更新任务执行结束");
}
}
}
在web.xml加上监听器声明,这样监听器就会在程序启动之后在后台一直运行:监听器配置:
<listener><!--定时器 -->
<listener-class>gbkj.listener.MyContextListener</listener-class>
</listener>