整体结构:
拦截器拦截请求:在拦截器中进行数据的存放,用一个公共的对象存放两个map结构的对象和mapstatus标标示,该标示表示当前使用的map对象,在定时任务中读取数据,先对当前的使用的map进行判断是否有数据,如果有切换使用的map,如果不先切换使用的map有可能该map还有其他线程在使用,导致数据不能同步,所以先切换map,然后保存数据,提交事务,清空未使用的map。
package com.powersi.biz.front.webstis.common; import java.util.HashMap; import java.util.Map; import java.util.concurrent.ConcurrentHashMap; public class WebTradeContainer { //当前缓冲区状态,标示数据写入哪个缓冲区 private volatile static int mapStatus = 1 ; //缓冲区1、2 private static Map<String,Object> map1 = new ConcurrentHashMap<String, Object>(); private static Map<String,Object> map2 = new ConcurrentHashMap<String, Object>(); private static Map webMap_stack = new HashMap(); public static Map<String,Object> getUserMap(){ if(mapStatus == 1){ return map1; } return map2; } public static void put(String key,Object value){ if(mapStatus == 1){ map1.put(key,value ); return; } map2.put(key,value); } public static Object get(String key){ if(mapStatus == 1){ return map1.get(key); } return map2.get(key); } public static void clear(){ if(mapStatus == 2){ map1.clear(); return; } map2.clear(); } public static Map getWebMap_stack() { return webMap_stack; } public static void setWebMap_stack(Map webMap_stack) { WebTradeContainer.webMap_stack = webMap_stack; } public static boolean containsKey(String key){ if(mapStatus==1){ return map1.containsKey(key); } return map2.containsKey(key); } public static int getMapStatus() { return mapStatus; } public static void setMapStatus(int mapStatus) { WebTradeContainer.mapStatus = mapStatus; } } |