一个定时更新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 )填充。

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

posted on 2006-12-13 14:46 pesome 阅读(4117) 评论(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

搜索

最新评论

阅读排行榜

评论排行榜