现实项目中有很多的时候都要使用到缓存来存储一些需要经常查看但是不常改变的值, 这篇博文重点说的是如何使用定时任务去获取微信签名,并且存储在缓存当中提供使用。
配置文件
ehcache.xml 配置上名为 weixinJsapi 名称的缓存变量 ,后期获取也是通过 weixinJsapi 名称来获取。
<?xml version="1.0" encoding="UTF-8"?>
<ehcache updateCheck="false">
<diskStore path="java.io.tmpdir" />
<!-- Cluster localhost setting -->
<cacheManagerPeerProviderFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerProviderFactory"
properties="peerDiscovery=automatic, multicastGroupAddress=230.0.0.1,
multicastGroupPort=4446, timeToLive=32"/>
<cacheManagerPeerListenerFactory
class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory"
properties="hostName=localhost, port=40001,socketTimeoutMillis=2000" />
<cache name="weixinJsapi" maxElementsInMemory="500" overflowToDisk="true"
eternal="true">
<cacheEventListenerFactory
class="net.sf.ehcache.distribution.RMICacheReplicatorFactory"
properties="replicatePuts=false,replicateUpdatesViaCopy=false" />
</cache>
<defaultCache maxElementsInMemory="10000" overflowToDisk="true"
eternal="false" memoryStoreEvictionPolicy="LRU" maxElementsOnDisk="10000000"
diskExpiryThreadIntervalSeconds="600" timeToIdleSeconds="3600"
timeToLiveSeconds="100000" diskPersistent="false" />
</ehcache>
定时器类 (每小时去获取一次微信签名,微信签名有效时间为两小时)
TokenTaskController
package com.szerp.wechat.contoller;
import java.text.SimpleDateFormat;
import java.util.Date;
import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;
import com.szerp.wechat.util.TokenUtil;
@Component
public class TokenTaskController {
private static final Logger logger = Logger.getLogger(TokenTaskController.class); // 日志类
@Scheduled(cron = "0 0 * * * ?")
public void tokenTask() throws Exception {
logger.info("获取token开始:"+new SimpleDateFormat("yyyy-MM-dd hh:mm:ss").format(new Date()) );
TokenUtil tokenutil=new TokenUtil();
tokenutil.keepToken();//定时存token
}
}
TokenUtil 任务工具类
package com.szerp.wechat.util;
import javax.servlet.ServletContext;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import org.apache.log4j.Logger;
import org.springframework.web.context.ContextLoader;
import org.springframework.web.context.WebApplicationContext;
import com.alibaba.fastjson.JSONObject;
/**
* @author 作者 E-mail:
* @version 创建时间:2020年03月06日 上午11:00:00
* 类说明
*/
public class TokenUtil extends HttpServlet{
/** serialVersionUID*/
private static final long serialVersionUID = 1L;
private static final Logger logger = Logger.getLogger(TokenUtil.class); // 日志类
private String token ;
/**
* <p>Description:获取token并存入服务器 </p>
* @date 2020年03月06日
* @version 1.0
*/
public void keepToken() {
// 生成token并存入服务器
try {
WebApplicationContext webApplicationContext = ContextLoader.getCurrentWebApplicationContext();
ServletContext context =webApplicationContext.getServletContext();
/**
* 生成Token令牌
*/
String access_token = this.createToken();
//存入缓存中
EhcacheUtil.getInstance().put("weixinJsapi", "access_token", access_token);
context.setAttribute("token", access_token );
logger.info("服务器存入access_token的值:"+context.getAttribute("token"));
} catch (Exception e) {
e.printStackTrace();
logger.info("服务器存入access_token的值报错:"+e.getMessage());
}
}
/**
* <p>Description:从服务器取token </p>
* @date 2020年03月06日
* @version 1.0
* @return
*/
public String seekToken(HttpServletRequest request) {
// 从服务器取token
try {
//从服务器上下文中获取微信签名
token = (String) request.getServletContext().getAttribute("token");
//缓存中获取微信签名
token=(String)EhcacheUtil.getInstance().get("weixinJsapi", "access_token");
if(token==null){
//如果Token为空,就在生成一次token存入到服务器中
/**
* 生成Token令牌
*/
String access_token = this.createToken();
request.getServletContext().setAttribute("token", access_token);
token=(String) request.getServletContext().getAttribute("token");
logger.info("服务器TOKEN值为空,重新存入服务器并获取===="+token);
//如果从服务器获取token失败,则执行请求获取,依然失败可能是网路问题
if(token==null){
/**
* 生成Token令牌
*/
token = this.createToken();
logger.info("服务器TOKEN值为空,直接请求获取===="+token);
}
}
} catch (Exception e) {
System.out.println(e.getMessage());
logger.info(e.getMessage());
}
return token;
}
/**
* 生成Token令牌
*/
public String createToken(){
String url = "https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid=自己的公众号id&secret=自己的公众号秘钥";
JSONObject jsonStrToken = CurrencyUtil.doGetStr(url) ;
String access_token = jsonStrToken.getString("access_token");
logger.info("生成Token令牌======"+access_token);
return access_token;
}
}
UpperShelfController 测试类 从缓存中获取到微信签名
package com.szerp.wechat.contoller.cangku;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.Properties;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.hibernate.Session;
import org.hibernate.SessionFactory;
import org.jeecgframework.core.common.exception.BusinessException;
import org.jeecgframework.core.common.hibernate.qbc.CriteriaQuery;
import org.jeecgframework.core.common.model.json.DataGrid;
import org.jeecgframework.core.util.StringUtil;
import org.jeecgframework.web.system.service.SystemService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Qualifier;
import org.springframework.context.annotation.Scope;
import org.springframework.core.io.ClassPathResource;
import org.springframework.core.io.support.PropertiesLoaderUtils;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.servlet.ModelAndView;
import com.alibaba.fastjson.JSONObject;
import com.szerp.wechat.util.CurrencyUtil;
import com.szerp.wechat.util.Sign;
import com.szerp.wechat.util.TokenUtil;
import com.szerp.wmstask.entity.LWmsTaskdetailsEntity;
import com.szerp.wmstask.service.LWmsTasksServiceI;
import com.szerp.wmstask.service.ReceiptTask;
import net.sf.json.JSONArray;
@Scope("prototype")
@Controller
public class UpperShelfController{
public void doToken(HttpServletRequest request){
// 1.获取token
TokenUtil tokenutil=new TokenUtil();
String access_token = tokenutil.seekToken(request);
}
}