一个定时更新cache框架

应项目需要做了一个定时更新的 cache 框架,采用 spring+quartz 很方便的实现,可以适用任何需要定时才更新的地方,比如静态网页 cache 等。代码很简单:

---------------------------------QuartzCacheHandler-------------------------------------

package  com.bankcomm.cache;

 

import  org.apache.commons.logging.Log;

import  org.apache.commons.logging.LogFactory;

import  org.springframework.context.ApplicationContext;

import  org.springframework.context.support.ClassPathXmlApplicationContext;

 

import  com.bankcomm.util.ContextUtil;

 

public   class  QuartzCacheHandler  {

       
private   static  ApplicationContext actx;

 

       Log log 
=  LogFactory.getLog( this .getClass());

 

       
/**

        * 程序载入配置文件<br>

        * Author:pesome<br>

        * Time:2006-12-8 上午10:29:26<br>

        
*/


       
public   static   void  init()  {

              
try   {

                     actx 
=   new  ClassPathXmlApplicationContext(

                                   
new  String[]  {  " quartzCache*.xml "  } );

              }
  catch  (Exception e)  {

                     e.printStackTrace();

                     
throw   new  RuntimeException();

              }


       }


 

       
private  QuartzCacheHandler()  {

       }


 

       
/**

        * 在程序载入配置文件时使用<br>

        * Author:pesome<br>

        * Time:2006-12-8 上午10:28:07<br>

        * 

        * 
@param  beanName

        * 
@param  key

        * 
@return

        
*/


       
public   static  Object getSe(String beanName, String key)  {

              
return  ((QuartzCache) actx.getBean(beanName)).get(key);

       }


 

       
/**

        * 在web容器中,初始化时载入配置文件时使用<br>

* Author:pesome<br>

        * Time:2006-12-8 上午10:28:40<br>

        * 

        * 
@param  beanName

        * 
@param  key

        * 
@return

        
*/


       
public   static  Object get(String beanName, String key)  {

              
return  ((QuartzCache) ContextUtil.getBean(beanName)).get(key);

       }


}


 

-----------------------------------QuartzCache-----------------------------------------------

package  com.bankcomm.cache;

 

import  java.util.HashMap;

import  java.util.Map;

 

import  org.apache.commons.logging.Log;

import  org.apache.commons.logging.LogFactory;

 

public   abstract   class  QuartzCache  {

       
private  Log log  =  LogFactory.getLog( this .getClass());

 

       
protected  Map cacheMap  =   new  HashMap();

 

       
/**

        * 抽象方法由具体的cache类实现,一般为调用put方法<br>

        * Author:pesome<br>

        * Time:2006-12-7 下午05:47:26<br>

        
*/


       
public   abstract   void  refresh();

 

       
public  Object get(String key)  {

              
return  cacheMap.get(key);

       }


 

       
public   void  put(String key, Object value)  {

              cacheMap.put(key, value);

              log.info(
" put to quartz cache key= "   +  key  +   " ,value= "   +  value);

       }


}


---------------------------------------------------------------------------------------------------------

Web.xml 中只需加 2 句:

 

< context-param >
        
< param-name > contextConfigLocation </ param-name >
        
< param-value > /WEB-INF/applicationContext*.xml </ param-value >
    
</ context-param >

    
< listener >
        
< listener-class >
            com.bankcomm.util.MyContextLoaderListener
        
</ listener-class >
    
</ listener >

 

最后是applicationContext_quartzCache.xml配置文件,就是标准的spring结合quartz的配置文件:

<? xml version="1.0" encoding="GB2312" ?>

<! DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN"

                       "http://www.springframework.org/dtd/spring-beans.dtd"
>

< beans >

     
< bean

         
class ="org.springframework.scheduling.quartz.SchedulerFactoryBean" >

         
< property  name ="triggers" >

              
< list >

                   
< ref  local ="simpleTrigger"   />

              
</ list >

         
</ property >

     
</ bean >

 

     
< bean  id ="methodInvokingJobDetail"

         class
="org.springframework.scheduling.quartz.MethodInvokingJobDetailFactoryBean" >

         
< property  name ="targetObject" >

              
< ref  bean ="simpleCache"   />

         
</ property >

         
< property  name ="targetMethod" >

              
< value > refresh </ value >

         
</ property >

     
</ bean >

 

     
< bean  id ="simpleTrigger"

         class
="org.springframework.scheduling.quartz.SimpleTriggerBean" >

         
< property  name ="jobDetail" >

              
<!--  see the example of method invoking job above  -->

              
< ref  bean ="methodInvokingJobDetail"   />

         
</ property >

         
< property  name ="startDelay" >

              
< value > 0 </ value >

         
</ property >

         
<!--  set the refresh interval,millisecond  -->

         
< property  name ="repeatInterval" >

              
< value > 2000 </ value >

         
</ property >

     
</ bean >

     

     
<!--  custom job beans  -->

    
< bean  id ="simpleCache"  class ="com.bankcomm.cache.SimpleCache" ></ bean >

</ beans >

 

写自己的QuartzCache子类并实现refresh方法,然后在配置文件中定义bean和相应的trigger就能方便的实现定时cache了。示例中使用了 SimpleTriggerBean ,每2s更新一次。也可以使用CronTriggerBean,每天定时更新。 使用 cache ,只需调用 QuartzCacheHandler 的 get 和 getSe 就行, get 是在由 web 容器启动 quartz 的场合使用, getSe 在使用 init 方法启动时使用。 Get 中调用了自己写的一个 ContextUtil ,它包含一个静态的 applicationContex 的引用,在 spring 容器启动后由 MyContextLoaderListener (重载 spring 的 ContextLoaderListener )填充。

这些东西也就几个小时搞定,多亏了spring,quartz这些开源软件啊。要自己用timer实现,费时费力,扩展性,易用性等也会差很多。

posted on 2006-12-13 14:46 pesome 阅读(4216) 评论(7)  编辑  收藏 所属分类: 开源软件

评论

# re: 一个定时更新cache框架 2006-12-13 15:34 BeanSoft

支持一下...呵呵..补充一下:quartz也可以用在非Web应用的定时操作,官方网站上说的.不要误解为只能在Spring里才能用它, 它就是一个普通的定时器类库.  回复  更多评论   

# re: 一个定时更新cache框架 2006-12-13 15:46 pesome

呵呵,spring因为提供了与quartz的集成,能方便的进行配置,所以使用了spring。能到openfans提交下你的blog不,有很多不错的东西啊。大家交个朋友,谢谢!  回复  更多评论   

# re: 一个定时更新cache框架 2006-12-13 15:55 BeanSoft

不客气...quartz我只看过,没用过.. 欢迎转载, 互相帮助, 共同进步! 有空我也去 openfans.net 灌水去..  回复  更多评论   

# re: 一个定时更新cache框架 2006-12-13 16:05 pesome

呵呵,现在还没开论坛,提交下你的blog(点击feed导入->增加feed)先,这样每天就可以看到你的新文章了。  回复  更多评论   

# re: 一个定时更新cache框架 2006-12-13 17:20 loocky

恩,是的SPRING+quartz可以定时FTP了==都可以  回复  更多评论   

# re: 一个定时更新cache框架 2007-01-03 10:43 guoyumin

good code

不过有些地方似乎有点过度设计的意思,也就是说,如果不用一些spring的特性,是不是会更简洁一些?有些地方似乎是为了用spring而用spring了,反而有些不够漂亮。设想一下,如果只用timer?真的不能写出更简洁的代码么?有机会的话可以讨论讨论,我也发现在用spring的过程中,经常会犯这样的问题,设计问题向spring上去靠:)

头一次看到你的地盘,不当之处海涵:)  回复  更多评论   

# re: 一个定时更新cache框架 2007-01-03 22:22 pesome

呵呵,首先一开始就知道spring+quarzt能实现这个功能,能直接拿来用,就没有考虑太多。timer以前用过,但比较粗浅。用spring主要是懒得写单例和配置文件,也的确是越来越依赖它了。  回复  更多评论   

<2007年1月>
日一二三四五六
31123456
78910111213
14151617181920
21222324252627
28293031123
45678910

导航

统计

公告

主要记录作者在学习java中的每一步足迹。除非特别说明,所有文章均为本blog作者原创,如需转载请注明出处和原作者,如用于商业目的,需跟作者本人联系。
欢迎大家访问:

常用链接

留言簿(16)

随笔分类

随笔档案

文章分类

文章档案

相册

收藏夹

java技术

人间百态

朋友们的blog

搜索

最新评论

阅读排行榜

评论排行榜