Requirement – To have persistent storage in ehcahce
Solution-
cacheManagerPeerProviderFactory –It is used for saying “Hello, I’m here!” and allows to discover the other CacheManager in the cluster and be discovered by other nodes.
It accepts only two arguments (class and properties).
cacheEventListenerFactory — It is used for receiving notification about cache update by other nodes in cache cluster.
bootstrapCacheLoaderFactory —It is used for starting cache system and synchronize the cached elements in the cluster.
package com.techartifact.caching;
import java.util.ArrayList;
import java.util.List;
import net.sf.ehcache.Cache;
import net.sf.ehcache.CacheManager;
import net.sf.ehcache.Element;
// this is main class.
public class MainClass {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
MainClass mainClass = new MainClass();
mainClass.runMainClass();
}
private void runMainClass() {
// TODO Auto-generated method stub
int TOTAL=3;
CacheManager cacheManager = new CacheManager();
Cache myCache = cacheManager.getCache("persistentEhcacheNew");
System.out.println("the size of my cache at startup is: "+myCache.getSize());
System.out.println("disk store size: "+myCache.getDiskStoreSize());
System.out.println("memory store size: "+myCache.getMemoryStoreSize());
System.out.println("memory DiskStoreSize size: "+myCache.getDiskStoreSize());
System.out.println("boot strapCacheLoader is Asynchronous: "+myCache.getBootstrapCacheLoader().isAsynchronous());
System.out.println("cache status: "+myCache.getStatus());
System.out.println("cache name: "+myCache.getName());
List listOfKeys= myCache.getKeys();
//myCache.removeAll();
if(myCache.getDiskStoreSize()>0){
for (Object temp : listOfKeys) {
System.out.println((String)temp.toString());
Element element = myCache.get(temp);
if (element != null) {
System.out.println(temp + " is in the cache!!!");
String val = (String)element.getValue().toString();
System.out.println(val + " value is in the cache!!!");
}
}
}else{
System.out.println("now add 3 elements to cache");
for (int i = 0; i < TOTAL; i++) {
DataObject dataObject = new DataObject();
dataObject.setRandomFloat(Randomizer.returnRandomFloat());
dataObject.setRandomString(Randomizer.returnRandomString());
Element element = new Element(i, dataObject.getRandomFloat());
myCache.put(element);
}
}
cacheManager.shutdown();
}
}
BootstrapCacheLoaderFactory – An abstract factory for creating BootstrapCacheLoader instances. Implementers should provide their own concrete factory extending this factory. It can then be configured in ehcache.xml.
Create a MyBootstrapCacheLoaderFactory that extends BootStrapCacheLoaderFactory, and override method load(EhCache ehcacheparam)to bring the cache up on server startup
package com.techartifact.caching;
import java.util.List;
import java.util.Properties;
import net.sf.ehcache.CacheException;
import net.sf.ehcache.Ehcache;
import net.sf.ehcache.Element;
import net.sf.ehcache.bootstrap.BootstrapCacheLoader;
import net.sf.ehcache.bootstrap.BootstrapCacheLoaderFactory;
//
public class MyBootstrapCacheLoaderFactory extends BootstrapCacheLoaderFactory implements BootstrapCacheLoader{
@Override
public BootstrapCacheLoader createBootstrapCacheLoader(Properties properties) {
// TODO Auto-generated method stub
return new MyBootstrapCacheLoaderFactory();
}
@Override
public Object clone() throws CloneNotSupportedException {
// TODO Auto-generated method stub
return super.clone();
}
public boolean isAsynchronous() {
// TODO Auto-generated method stub
return false;
}
public void load(Ehcache myCache) throws CacheException {
// TODO Auto-generated method stub
System.out.println("load your cache with whatever you want....");
List keys = myCache.getKeys();
for (int i = 0; i < keys.size(); i++) {
Element element = myCache.get((keys.get(i).toString()));
}
System.out.println("load complete!");
}
}