
接着分析Tomcat对上面机制详细的实现,正常情况下为了支持高效的并发操作,tomcat的所有会话集使用ConcurrentHashMap
public Object put(Object key, Object value) {
①实例化MapEntry,将key和value传入,并设置源节点为目前节点。
②判断本地内存是否已包含key,如是则不仅要本地remove掉,还要跨节点remove。
③通过Round robin算法从MapMember中选择一个作为备份节点。
④实例化一个包含MSG_BACKUP标识的MapMessage对象并发送给备份节点。
⑤实例化一个包含MSG_PROXY标识的MapMessage对象并发送给除了备份节点外的其他(代理)节点。
⑥put进本地缓存。
}
其次,再看看它如何通过get实现获取会话对象操作:
public Object get(Object key) {
①获取本地的MapEntry对象,它或许直接包含了会话对象,或许包含了会话对象的存放位置信息。
②判断本节点是否属于源节点,如为源节点则直接获取MapEntry对象里面的会话对象并返回。
③判断本节点是否属于备份节点,若为备份节点则直接获取MapEntry对象里面的会话对象作为返回对象,并且还要将本节点升为源节点、重新选取一个新备份节点,把MapEntry对象拷贝到新备份节点。
④判断本节点是否属于代理节点,若为代理节点则向其他节点发送会话对象拷贝请求,“集群中谁有此会话对象请发送给我”,把接收到的会话对象放到本节点并作为返回对象,最后将本节点升为源节点。
}
最后,看看删除会话对象remove操作的实现:
public Object remove(Object key) {
①删除本地此MapEntry对象。
②广播其他节点删除此MapEntry对象。
}
通过上面三个方法已经很清晰描述了新的Map是如何进行跨节点的增删改查的,BackupManager会话管理器就是通过这个新的Map进行会话管理。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持易采站长站。









