EJB AOP + Ehcache实现EJB方法缓存

Web Service

Spring AOP

实现思路如下:

ehcache-core.jar

slf4j-api.jar

slf4j-log4j.jar

首先封装一个缓存处理类,功能如下

获取缓存对象

根据名称获取缓存对象

清空缓存对象

根据名称清空缓存对象

添加缓存对象

public class CacheHandler {//缓存管理器变量private CacheManager manager;//缓存变量private Cache cache;//缓存名称private final String cacheName="EJB_METHOD_CACHE";/********************************单例模式(饿汉式) begin***********************************************/private static CacheHandler cacheHandler=new CacheHandler();/** * 私有构造函数 */private CacheHandler(){System.out.println("—————创建单例 begin————–");initCache();System.out.println("—————创建单例 end————–");}public static CacheHandler getInstance(){return cacheHandler;}/********************************单例模式(饿汉式) end***********************************************//** * @MethodName: initCache * @Description: 初始化缓存 */private void initCache(){//1.创建cachemanagerURL url=getClass().getResource("/ehcache.xml");manager=CacheManager.create(url);cache=manager.getCache(cacheName);//如果cache是空,則手動創建// 当启动hibernate二级缓存时,cache为空if(cache==null){cache=new Cache("EJB_METHOD_CACHE", 10000, true, false, 600000, 300000);manager.addCache(cache);}}/** * @MethodName: getCache * @Description: 外部通过get方法拿到cache后,可清空cache * @return */public Cache getCache() {return cache;}/** * @MethodName: getCacheByName * @Description: 根据缓存名称获取缓存 * @param cacheName缓存名称 * @return缓存名称对应的缓存对象 */public Cache getCacheByName(String cacheName){return manager.getCache(cacheName);}/** * @MethodName: clearCache * @Description: 清理缓存 */public void clearCache(){if(cache!=null){cache.removeAll();}}/** * @MethodName: clearCacheByName * @Description: 根据缓存名称删除缓存 * @param cacheName缓存名称 */public void clearCacheByName(String cacheName){getCacheByName(cacheName).removeAll();}/** * @MethodName: addCache * @Description: 用户自定义缓存 * @param cacheName自定义缓存的名称 * @return自定义的缓存 */public Cache addCache(String cacheName){Cache customCache = manager.getCache(cacheName);if(customCache==null){customCache =new Cache(cacheName, 10000, false, false, 600000, 300000);manager.addCache(customCache);}return customCache;}}为查询方法添加缓存

应用于查询方法的拦截器

public class CacheInterceptor {@AroundInvokepublic Object processCache(InvocationContext context) throws Exception{String targetName = context.getTarget().getClass().getName();String methodName = context.getMethod().getName();Object[] arguments =context.getParameters();Object result;//获取缓存对象Cache cache = CacheHandler.getInstance().getCache();//如果方法名以find、query、或get开头则执行缓存策略if(methodName.startsWith("find") || methodName.startsWith("get") || methodName.startsWith("query")){String cacheKey = getCacheKey(targetName, methodName, arguments);Element element = cache.get(cacheKey);if (element == null) {result = context.proceed(); // 执行目标方法,并保存目标方法执行后的返回值element = new Element(cacheKey, (Serializable) result);cache.put(element);System.out.println("createCache–>" + cacheKey);} else {System.out.println("hit Cache–>" + cacheKey);}return element.getObjectValue();}//否则直接执行目标方法return context.proceed();}/** * @MethodName: getCacheKey * @Description: 获得cache key的方法,cache key是Cache中一个Element的唯一标识 cache key包括 * 包名+类名+方法名+各个参数的具体指,如com.co.cache.service.UserServiceImpl.getAllUser * @param targetName类名 * @param methodName方法名 * @param arguments方法实参数组 * @returncachekey */private String getCacheKey(String targetName, String methodName,Object[] arguments) {StringBuffer sb = new StringBuffer();sb.append(targetName).append(".").append(methodName);if ((arguments != null) && (arguments.length != 0)) {for (int i = 0; i < arguments.length; i++) {if(arguments[i] instanceof String[]){String[] strArray = (String[])arguments[i];sb.append(".");for(String str : strArray){sb.append(str);}}else{sb.append(".").append(arguments[i]);}}}return sb.toString();}}

其实就是一行注解:@Interceptors(CacheInterceptor.class),如下所示

@Stateless@Remote( IJcCommonBean.class)@TransactionManagement(TransactionManagementType.CONTAINER)@TransactionAttribute(TransactionAttributeType.REQUIRED)@WebService(endpointInterface = "mgr.jc.webservice.common.IJcCommonBean",serviceName = "JcCommonService",targetNamespace = "")@Interceptors(CacheInterceptor.class)public class JcCommonBeanImpl extends BaseMgr implements IJcCommonBean {//此处是EJB业务逻辑方法}清除缓存

生命有限,努力无限

EJB AOP + Ehcache实现EJB方法缓存

相关文章:

你感兴趣的文章:

标签云: