转自 http://benx.iteye.com/blog/606083
Oscache的集群功能没有完全实现,只是实现了flush的接口,需要用户自己去实现它的其它集群接口(不知道他是出于什么考虑). 如果采用Jgroups组件,则需要继承自JavaGroupsBroadcastingListener抽象类,继承它的handleClusterNotification方法,完成集群其它功能的实现:
注意:集群中传递的对象必须实现Serializable接口。
- public class JavaGroupsBroadcastingListenerImpl extends
- JavaGroupsBroadcastingListener {
- public void handleClusterNotification(ClusterNotification message) {
- switch (message.getType()) {
- case CacheConstants.CLUSTER_ENTRY_ADD:
- System.out.println("集群新增:" + message.getData());
- if(message.getData() instanceof QflagCacheEvent) {
- QflagCacheEvent event = (QflagCacheEvent)message.getData();
- cache.putInCache(event.getKey(), event.getEntry().getContent(),null,null,CLUSTER_ORIGIN);
- }
- break;
- case CacheConstants.CLUSTER_ENTRY_UPDATE:
- System.out.println("集群更新:" + message.getData());
- if(message.getData() instanceof QflagCacheEvent) {
- QflagCacheEvent event = (QflagCacheEvent)message.getData();
- cache.putInCache(event.getKey(), event.getEntry().getContent(),null,null,CLUSTER_ORIGIN);
- }
- break;
- case CacheConstants.CLUSTER_ENTRY_DELETE:
- System.out.println("集群删除:" + message.getData());
- if(message.getData() instanceof QflagCacheEvent) {
- QflagCacheEvent event = (QflagCacheEvent)message.getData();
- // cache.removeEntry(event.getKey(),event.getOrigin());
- cache.removeEntry(event.getKey());
- }
- break;
- }
- }
- public void cacheEntryAdded(CacheEntryEvent event) {
- super.cacheEntryAdded(event);
- if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
- sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_ADD, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
- }
- }
- // @Override
- // public void cacheEntryFlushed(CacheEntryEvent event) {
- //
- // super.cacheEntryFlushed(event);
- // if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
- // sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_ADD, new UcallCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
- // }
- // }
- @Override
- public void cacheEntryRemoved(CacheEntryEvent event) {
- super.cacheEntryRemoved(event);
- if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
- sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_DELETE, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
- }
- }
- @Override
- public void cacheEntryUpdated(CacheEntryEvent event) {
- super.cacheEntryUpdated(event);
- if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
- sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_UPDATE, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
- }
- }
- }
public class JavaGroupsBroadcastingListenerImpl extends
JavaGroupsBroadcastingListener {
public void handleClusterNotification(ClusterNotification message) {
switch (message.getType()) {
case CacheConstants.CLUSTER_ENTRY_ADD:
System.out.println("集群新增:" + message.getData());
if(message.getData() instanceof QflagCacheEvent) {
QflagCacheEvent event = (QflagCacheEvent)message.getData();
cache.putInCache(event.getKey(), event.getEntry().getContent(),null,null,CLUSTER_ORIGIN);
}
break;
case CacheConstants.CLUSTER_ENTRY_UPDATE:
System.out.println("集群更新:" + message.getData());
if(message.getData() instanceof QflagCacheEvent) {
QflagCacheEvent event = (QflagCacheEvent)message.getData();
cache.putInCache(event.getKey(), event.getEntry().getContent(),null,null,CLUSTER_ORIGIN);
}
break;
case CacheConstants.CLUSTER_ENTRY_DELETE:
System.out.println("集群删除:" + message.getData());
if(message.getData() instanceof QflagCacheEvent) {
QflagCacheEvent event = (QflagCacheEvent)message.getData();
// cache.removeEntry(event.getKey(),event.getOrigin());
cache.removeEntry(event.getKey());
}
break;
}
}
public void cacheEntryAdded(CacheEntryEvent event) {
super.cacheEntryAdded(event);
if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_ADD, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
}
}
// @Override
// public void cacheEntryFlushed(CacheEntryEvent event) {
//
// super.cacheEntryFlushed(event);
// if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
// sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_ADD, new UcallCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
// }
// }
@Override
public void cacheEntryRemoved(CacheEntryEvent event) {
super.cacheEntryRemoved(event);
if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_DELETE, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
}
}
@Override
public void cacheEntryUpdated(CacheEntryEvent event) {
super.cacheEntryUpdated(event);
if(!CLUSTER_ORIGIN.equals(event.getOrigin())) {
sendNotification(new ClusterNotification(CacheConstants.CLUSTER_ENTRY_UPDATE, new QflagCacheEvent(event.getMap(),event.getEntry(),CLUSTER_ORIGIN)));
}
}
}
- package qflag.ucall.cache;
- public class CacheConstants {
- /**
- * 添加缓存对象操作
- */
- public final static int ACTION_ADD_OBJ = 1;
- /**
- * 更新缓存对象操作
- */
- public final static int ACTION_UPDATE_OBJ = 2;
- /**
- * 删除缓存对象操作
- */
- public final static int ACTION_DELETE_OBJ = 3;
- /**
- * 刷新缓存对象
- */
- public final static int ACTION_FLUSH_OBJ = 4;
- /**
- * 集群entry add处理
- */
- public final static int CLUSTER_ENTRY_ADD = 20;
- /**
- * 集群entry update处理
- */
- public final static int CLUSTER_ENTRY_UPDATE = 21;
- /**
- * 集群entry delete处理
- */
- public final static int CLUSTER_ENTRY_DELETE = 22;
- }
package qflag.ucall.cache;
public class CacheConstants {
/**
* 添加缓存对象操作
*/
public final static int ACTION_ADD_OBJ = 1;
/**
* 更新缓存对象操作
*/
public final static int ACTION_UPDATE_OBJ = 2;
/**
* 删除缓存对象操作
*/
public final static int ACTION_DELETE_OBJ = 3;
/**
* 刷新缓存对象
*/
public final static int ACTION_FLUSH_OBJ = 4;
/**
* 集群entry add处理
*/
public final static int CLUSTER_ENTRY_ADD = 20;
/**
* 集群entry update处理
*/
public final static int CLUSTER_ENTRY_UPDATE = 21;
/**
* 集群entry delete处理
*/
public final static int CLUSTER_ENTRY_DELETE = 22;
}
- package qflag.ucall.cache.event;
- import java.io.Serializable;
- import com.opensymphony.oscache.base.Cache;
- import com.opensymphony.oscache.base.CacheEntry;
- import com.opensymphony.oscache.base.events.CacheEntryEvent;
- import com.opensymphony.oscache.base.events.CacheEvent;
- public class QflagCacheEvent extends CacheEvent implements Serializable {
- /**
- * The cache where the entry resides.
- */
- private Cache map = null;
- /**
- * The entry that the event applies to.
- */
- private CacheEntry entry = null;
- /**
- * Constructs a cache entry event object with no specified origin
- *
- * @param map
- * The cache map of the cache entry
- * @param entry
- * The cache entry that the event applies to
- */
- public QflagCacheEvent(Cache map, CacheEntry entry) {
- this(map, entry, null);
- }
- /**
- * Constructs a cache entry event object
- *
- * @param map
- * The cache map of the cache entry
- * @param entry
- * The cache entry that the event applies to
- * @param origin
- * The origin of this event
- */
- public QflagCacheEvent(Cache map, CacheEntry entry, String origin) {
- super(origin);
- this.map = map;
- this.entry = entry;
- }
- /**
- * Retrieve the cache entry that the event applies to.
- */
- public CacheEntry getEntry() {
- return entry;
- }
- /**
- * Retrieve the cache entry key
- */
- public String getKey() {
- return entry.getKey();
- }
- /**
- * Retrieve the cache map where the entry resides.
- */
- public Cache getMap() {
- return map;
- }
- public String toString() {
- return "key=" + entry.getKey();
- }
- }
package qflag.ucall.cache.event;
import java.io.Serializable;
import com.opensymphony.oscache.base.Cache;
import com.opensymphony.oscache.base.CacheEntry;
import com.opensymphony.oscache.base.events.CacheEntryEvent;
import com.opensymphony.oscache.base.events.CacheEvent;
public class QflagCacheEvent extends CacheEvent implements Serializable {
/**
* The cache where the entry resides.
*/
private Cache map = null;
/**
* The entry that the event applies to.
*/
private CacheEntry entry = null;
/**
* Constructs a cache entry event object with no specified origin
*
* @param map
* The cache map of the cache entry
* @param entry
* The cache entry that the event applies to
*/
public QflagCacheEvent(Cache map, CacheEntry entry) {
this(map, entry, null);
}
/**
* Constructs a cache entry event object
*
* @param map
* The cache map of the cache entry
* @param entry
* The cache entry that the event applies to
* @param origin
* The origin of this event
*/
public QflagCacheEvent(Cache map, CacheEntry entry, String origin) {
super(origin);
this.map = map;
this.entry = entry;
}
/**
* Retrieve the cache entry that the event applies to.
*/
public CacheEntry getEntry() {
return entry;
}
/**
* Retrieve the cache entry key
*/
public String getKey() {
return entry.getKey();
}
/**
* Retrieve the cache map where the entry resides.
*/
public Cache getMap() {
return map;
}
public String toString() {
return "key=" + entry.getKey();
}
}