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正式工作前的准备工作。
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="/>
类图如下:
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类图如下:
各类listener总结: CacheManagerEventListener:负责监听cachemanager的操作,调用cachemanager的addCache/removeCache是触发。默认配置Ehcache没有包含该listener的实现,只有一个抽象类。可以自己扩展自定义类。 CacheManagerPeerListener:负责监听和维护cachepeer,触发方式和上一个类似。实际上也是出自同一个接口。 CacheEventListener:负责处理cache事件。比如为cache replication实现了:RMIAsynchronousCacheReplicator和RMISynchronousCacheReplicator Cache replication过程如下:
相关文章
- 快速阅读《QT5.9 c++开发指南》1
- Unity类银河恶魔城学习记录12-5 p127 Stat ToolTip源代码
- Pose-Guided Feature Alignment for Occluded Person Re-Identification阅读笔记
- 网页源代码获取
- 欢迎测试我的新软件HttpProxySpy V1.0 - Http代理侦探(含源代码)
- 周赛-Clique in the Divisibility Graph 分类: 比赛 2015-08-02 09:02 23人阅读 评论(3) 收藏
- 好用到没朋友的大数模板(c++) 2014-10-01 15:06 116人阅读 评论(0) 收藏
- 论文阅读笔记---Deep High Dynamic Range Imaging of Dynamic Scanes
- 【MAC考核】论文阅读《DeepVO: Towards End-to-End Visual Odometry with Deep Recurrent Convolutional Neural Net》
- 【论文阅读】 AMNN: Attention-Based Multimodal Neural Network Model for Hashtag Recommendation