应项目需要做了一个定时更新的 cache 框架,采用 spring+quartz 很方便的实现,可以适用任何需要定时才更新的地方,比如静态网页 cache 等。代码很简单:
---------------------------------QuartzCacheHandler-------------------------------------
<o:p> </o:p>
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 句:
<o:p> </o:p>
<o:p>
<
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
>
</o:p>
最后是applicationContext_quartzCache.xml配置文件,就是标准的spring结合quartz的配置文件:<o:p></o:p>
<o:p> </o:p>
<o:p>
<?
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
>
</o:p>
写自己的QuartzCache子类并实现<
1148

被折叠的 条评论
为什么被折叠?



