java 緩存ehcache的使用 定時任務獲取微信簽名

現實項目中有很多的時候都要使用到緩存來存儲一些需要經常查看但是不常改變的值, 這篇博文重點說的是如何使用定時任務去獲取微信簽名,並且存儲在緩存當中提供使用。

配置文件

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);
		
	
	}

}

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章