Tuesday, June 3, 2008

OSCache + Spring Framework

Since I didn't find a good reference to using OSCache with Spring after browsing the web for a day or so I thought that it would be useful to have this posted.

This example uses source level metadata (JDK 5.0 annotation) to tag methods as cacheable and configure the refreshPeriod for a particular OSCache's cache group (it's the same concept as cache region when using OSCache with Hibernate).

We first tag the methods with annotations:
@Cacheable(modelId = "testCaching")
public List<Listing> getListings() {
// some implementation

@Cacheable(modelId = "testFlushing")
public void saveListings(List<Listing> listing) {
// some implementation

And then we add the following to the application-context.xml for Spring:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE beans PUBLIC "-//SPRING//DTD BEAN//EN" "http://www.springframework.org/dtd/spring-beans.dtd">

<!-- Domain -->
<bean id="listingRepositoryXmlImpl"

<!-- Cache Setup -->
<bean id="autoproxy"
class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" />

The created cache manager is a singleton instance of
<bean id="cacheManager"
<!-- Optional properties -->
<property name="configLocation"
value="classpath:oscache.properties" />

<bean id="cacheProviderFacade"
<property name="cacheManager" ref="cacheManager" />

<!-- Cache-feature Weaving -->
<bean id="cachingAttributeSource"

<bean id="cachingInterceptor"
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="cachingAttributeSource"
ref="cachingAttributeSource" />
<property name="cachingListeners">
<!-- We don't have any listener for now
<ref bean="cachingListener" />
<property name="cachingModels">
Bean properties are set here for the underlying CachingModel implementation (OsCacheCachingModel).
Here we are setting the "group" and "refreshPeriod".
Note that the PropertyEditor will translate the semicolon separated key-values into a java.util.Map

<prop key="testCaching"><!-- Here we map the modelId "testCaching" (Spring) to group "testCache" (OSCache), we also set the refresh period -->

<bean id="cachingAttributeSourceAdvisor"
<constructor-arg ref="cachingInterceptor" />

<bean id="flushingAttributeSource"

<bean id="flushingInterceptor"
<property name="cacheProviderFacade" ref="cacheProviderFacade" />
<property name="flushingAttributeSource"
ref="flushingAttributeSource" />
<property name="flushingModels">
<!-- Refresh period is set here for the underlying CachingModel implementation (OsCacheCachingModel) -->

<prop key="testFlushing"><!-- Here we map the modelId "testFlushing" (Spring) to group "testCache" (OSCache) -->

<bean id="flushingAttributeSourceAdvisor"
<constructor-arg ref="flushingInterceptor" />


And that's all there is to it. Happy caching!

No comments: