Ehcache源代码阅读

时间:2024-04-06 19:01:20

1. 配置文件解析 由标准的SAX方式解析ehcache.xml到一个Configuration对象。关键类是BeanHandler+Configuration。BeanHandler的技巧在于xml tag/property与java bean的名称约定,找到一个tag就直接用tag名找到对应的add/extract/set方法call进去。类写的短小精悍,坏处是每个java类的写法都要受到限制。 2. Cache初始化 CacheManager.getInstance()出发singleton的生成。生成方式很简单,new CacheManager()。构造函数也很简单,就call个init方法,这里面完成了所有Ehcache正式工作前的准备工作。
Ehcache源代码阅读
 3. CacheManagerPeerProvider/HeartbeatSender/HeartbeatReciever Ehcache replication的multicast实现实际上只是由multicast方式维护各个Ehcace node之间的heartbeat通讯,而真正的cache内容replication而是rmi方式做的unicast。这意味着在N个节点的cluster里,一个节点需要做n-1次rmi才能完成一次replication。如果N很大而且系统频繁更新cache内容的话,结果应该会很不理想。 相关配置: <cacheManagerPeerProviderFactory properties="peerDiscovery=automatic, multicastGroupAddress=, multicastGroupPort=, timeToLive=1"/> 其中,multicastGroupAddress/multicastGroupPort就是heartbeat sender和reciever用来通信的multicast地址和端口。地址必须使用multicast ip adress. MulticastKeepaliveHeartbeatSender: 这是个每隔5秒持续往其他节点发送heart beat的线程。它会把节点内所有的cache的JNDI地址发送出去。本地cache列表通过CacheManagerPeerListener获得。 private List createCachePeersPayload() { CacheManagerPeerListener cacheManagerPeerListener = cacheManager.getCachePeerListener("RMI"); ...... List localCachePeers = cacheManagerPeerListener.getBoundCachePeers(); ..... } Heartbeat payload数据结构如下: //hostName:port/cache name|//hostName:port/cache name MulticastKeepaliveHeartbeatReceiver: 后台线程监听multicast数据,将接收到的heartbeat payload解析成CachePeer对象注册到CacheManagerPeerProvider的peer list中。 4. CachePeerListener 这个listener监听所有的cache添加和移除操作,为每一个cache进行JNDI/RMI注册。配置如下: <cacheManagerPeerListenerFactory class="net.sf.ehcache.distribution.RMICacheManagerPeerListenerFactory" properties="port=,socketTimeoutMillis=12000,hostName="/>
Ehcache源代码阅读
  类图如下:
Ehcache源代码阅读
  5. Cache replicator 决定一个cache是否需要replication的因素是看有没有给这个cache配置Replicator. <defaultCache ......> <cacheEventListenerFactory properties="replicateAsynchronously=true, replicatePuts=true, replicateUpdates=true, replicateUpdatesViaCopy=true, replicateRemovals=true "/> </defaultCache> 此处定义的replicator会被放到Cache对象的registeredEventListeners中去,在cache元素发生变化时触发listener相应动作。 protected boolean isDistributed(Ehcache cache) { Set listeners = cache.getCacheEventNotificationService().getCacheEventListeners(); for (Iterator iterator = listeners.iterator(); iterator.hasNext();) { CacheEventListener cacheEventListener = (CacheEventListener) iterator.next(); if (cacheEventListener instanceof CacheReplicator) { return true; } } return false; } 此方法在cache生成是调用,如果返回为true,则为之生成Remote对象CachePeer并注册到JNDI中去。 CachePeer类图如下:
Ehcache源代码阅读
  各类listener总结: CacheManagerEventListener:负责监听cachemanager的操作,调用cachemanager的addCache/removeCache是触发。默认配置Ehcache没有包含该listener的实现,只有一个抽象类。可以自己扩展自定义类。 CacheManagerPeerListener:负责监听和维护cachepeer,触发方式和上一个类似。实际上也是出自同一个接口。 CacheEventListener:负责处理cache事件。比如为cache replication实现了:RMIAsynchronousCacheReplicator和RMISynchronousCacheReplicator Cache replication过程如下: 
Ehcache源代码阅读