通过对ClusterManager 源码的学习,对其Cluster的 整体思路有了一些认识。

在ClusterManager 中有一段静态代码段,如下:

static {// Listen for clustering property changes (e.g. enabled/disabled)PropertyEventDispatcher.addListener(new PropertyEventListener() {public void propertySet(String property, Map<String, Object> params) { /* ignore */ }public void propertyDeleted(String property, Map<String, Object> params) { /* ignore */ }public void xmlPropertyDeleted(String property, Map<String, Object> params) { /* ignore */ }public void xmlPropertySet(String property, Map<String, Object> params) {if (ClusterManager.CLUSTER_PROPERTY_NAME.equals(property)) {if (Boolean.parseBoolean((String) params.get("value"))) {// Reload/sync all Jive propertiesJiveProperties.getInstance().init();ClusterManager.startup();} else {ClusterManager.shutdown();}}}});

其主要功能是 建立一个 属性 监听器,并插入到 PropertyEventDispatcher 中。PropertyEventDispatcher   顾名思义,就是一个属性事件分发器,当openfire系统中的某个属性发生变换后,PropertyEventDispatcher  会通知其保存的各个PropertyEventListener(当然包含此处建立的这个)。

在这里,属性监听器 的主要功能 体现在 xmlPropertySet 函数中,即 监听 clustering.enabled 属性值的变化,如果 为变为true,则重载所有Jive属性值,并调

用 ClusterManager.startup() 来启动cluster。 否则,则关闭cluster,即执行 ClusterManager.shutdown()。

下面来看看ClusterManager.startup() 的代码:

public static synchronized void startup() {if (isClusteringEnabled() && !isClusteringStarted()) {initEventDispatcher();CacheFactory.startClustering();}
}

可以看出,在Cluster启用并且未被启动的前提下,startup 函数执行 两个函数: initEventDispatcher()  和 CacheFactory.startClustering()

private static void initEventDispatcher() {if (dispatcher == null || !dispatcher.isAlive()) {dispatcher = new Thread("ClusterManager events dispatcher") {@Overridepublic void run() {// exit thread if/when clustering is disabledwhile (ClusterManager.isClusteringEnabled()) {try {Event event = events.take();EventType eventType = event.getType();// Make sure that CacheFactory is getting this events first (to update cache structure)if (event.getNodeID() == null) {// Replace standalone caches with clustered caches and migrate dataif (eventType == EventType.joined_cluster) {CacheFactory.joinedCluster();} else if (eventType == EventType.left_cluster) {CacheFactory.leftCluster();}}// Now notify rest of the listenersfor (ClusterEventListener listener : listeners) {try {switch (eventType) {case joined_cluster: {if (event.getNodeID() == null) {listener.joinedCluster();}else {listener.joinedCluster(event.getNodeID());}break;}case left_cluster: {if (event.getNodeID() == null) {listener.leftCluster();}else {listener.leftCluster(event.getNodeID());}break;}case marked_senior_cluster_member: {listener.markedAsSeniorClusterMember();break;}default:break;}}catch (Exception e) {Log.error(e.getMessage(), e);}}// Mark event as processedevent.setProcessed(true);} catch (Exception e) {Log.warn(e.getMessage(), e);}}}};dispatcher.setDaemon(true);dispatcher.start();}}

在 initEventDispatcher 内部,实质上是创建了一个后台线程,用来处理ClusterManager 所持有的 事件队列中的事件。处理方式无非是根据event的类型,来 相应的通知 监听者进行处理。事件的类型 在ClusterManager中定义如下:

private enum EventType {/*** This JVM joined a cluster.*/joined_cluster,/*** This JVM is no longer part of the cluster.*/left_cluster,/*** This JVM is now the senior cluster member.*/marked_senior_cluster_member}

处理完成之后调用event.setProcessed(true);

在此之后,调用CacheFactory.startClustering()来真正启动Cluster。其代码如下:

public static void startClustering() {if (isClusteringAvailable()) {clusteringStarting = clusteredCacheFactoryStrategy.startCluster();}if (clusteringStarting) {if (statsThread == null) {// Start a timing thread with 1 second of accuracy.statsThread = new Thread("Cache Stats") {private volatile boolean destroyed = false;@Overridepublic void run() {XMPPServer.getInstance().addServerListener(new XMPPServerListener() {public void serverStarted() {}public void serverStopping() {destroyed = true;}});ClusterManager.addListener(new ClusterEventListener() {public void joinedCluster() {}public void joinedCluster(byte[] nodeID) {}public void leftCluster() {destroyed = true;ClusterManager.removeListener(this);}public void leftCluster(byte[] nodeID) {}public void markedAsSeniorClusterMember() {}});// Run the timer indefinitely.while (!destroyed && ClusterManager.isClusteringEnabled()) {// Publish cache stats for this cluster node (assuming clustering is// enabled and there are stats to publish).try {cacheFactoryStrategy.updateCacheStats(caches);}catch (Exception e) {log.error(e.getMessage(), e);}try {// Sleep 10 seconds.sleep(10000);}catch (InterruptedException ie) {// Ignore.}}statsThread = null;log.debug("Cache stats thread terminated.");}};statsThread.setDaemon(true);statsThread.start();}}}

在代码中进行了相关判断,并首先调用了clusteredCacheFactoryStrategy.startCluster() 方法。关于clusteredCacheFactoryStrategy的初始化方式在 缓存学习一节中有讲到。

而后设置了一个后台线程,在该线程中,首先添加服务器监听事件,用来监听服务器的关闭事件,之后添加集群事件监听器,用来监听节点的“离开集群”事件。最后,以10秒为周期 调用cacheFactoryStrategy.updateCacheStats(caches)来更新缓存。

至此,集群功能启动完毕

ClusterManager 源码及原理学习相关推荐

  1. 反射机制源码及原理学习

    感谢:http://www.cnblogs.com/chanshuyi/p/head_first_of_reflection.html#反射源码解析 脑图先行(好像已经说清楚了= =,那就不废话说文字 ...

  2. 【 线性模型 Linear-Model 数学原理分析以及源码实现 深度学习 Pytorch笔记 B站刘二大人(1/10)】

    线性模型 Linear-Model 数学原理分析以及源码实现 深度学习 Pytorch笔记 B站刘二大人(1/10) 数学原理分析 线性模型是我们在初级数学问题中所遇到的最普遍也是最多的一类问题 在线 ...

  3. 《STL源码剖析》学习--6章--_rotate算法分析

     最近在看侯捷的<STL源码剖析>,其中有许多不太明白之处,后经分析或查找资料有了些理解,现记录一下. <STL源码剖析>学习--6章--random access ite ...

  4. [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积

    [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 文章目录 [源码解析] 深度学习流水线并行GPipe (2) ----- 梯度累积 0x00 摘要 0x01 概述 1.1 前 ...

  5. 生成对抗网络入门详解及TensorFlow源码实现--深度学习笔记

    生成对抗网络入门详解及TensorFlow源码实现–深度学习笔记 一.生成对抗网络(GANs) 生成对抗网络是一种生成模型(Generative Model),其背后最基本的思想就是从训练库里获取很多 ...

  6. 【天池智慧海洋建设】Topline源码——特征工程学习(总结)

    [天池智慧海洋建设]Topline源码--特征工程学习 目录 [天池智慧海洋建设]Topline源码--特征工程学习 前言 学习来源 部分解释 学习目标 内容介绍 I 特征工程概述 I 数据部分 II ...

  7. 【天池智慧海洋建设】Topline源码——特征工程学习(大白)

    [天池智慧海洋建设]Topline源码--特征工程学习 团队名称:大白 链接: https://github.com/Ai-Light/2020-zhihuihaiyang 目录 [天池智慧海洋建设] ...

  8. [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现

    [源码解析] 深度学习流水线并行Gpipe(1)-流水线基本实现 文章目录 [源码解析] 深度学习流水线并行Gpipe(1)---流水线基本实现 0x00 摘要 0x01 概述 1.1 什么是GPip ...

  9. CNN入门详解及TensorFlow源码实现--深度学习笔记

    CNN入门详解及TensorFlow源码实现–深度学习笔记 ##一.卷积神经网络 ###1.简介 卷积神经网络是一种前馈神经网络,它的人工神经元可以响应一部分覆盖范围内的周围单元,对于大型图像处理有出 ...

最新文章

  1. maven+springMVC+Eclipse建立工程框架
  2. python解决https私密连接警告信息
  3. 银行流水你真的会看吗?
  4. java===Runtime类
  5. Linux应急响应入门--入侵排查(全面)
  6. 德国精品软件推荐   压缩软件 WINRAR 个人版终于免费了。
  7. Python学习(六)模块
  8. 2021-2025年中国催产药行业市场供需与战略研究报告
  9. 计算机杀毒记录表格,11科室计算机杀毒登记表
  10. 【t098】符文之语
  11. 跨境电商ERP系统功能有那些?
  12. 前端预览PDF总结:iframe、embed、PDFObject、PDF.js
  13. java 批量重命名_Java实现文件批量重命名
  14. 电商网站秒杀系统如何设计
  15. 零基础转行大数据可行吗?大数据开发需要什么基础呢?
  16. FreeMaker一篇通
  17. 配置 JAVA_HOME
  18. 【uniapp】悬浮球(floatball)全局组件——全局消息提醒功能
  19. ASP.NET 基础(7)
  20. php表单生成Excel,PHPExcel多表单数据导出

热门文章

  1. React组件之间传值
  2. 支付宝hr终面,忐忑的等待结果
  3. Java游戏项目之大鱼吃小鱼
  4. 云计算项目经理前景_工人和施工项目经理有什么区别
  5. java jfreechar鱼刺图_java-使用Jfreechart更改条形图中值轴的起始值
  6. 交通运输行业S2B2C商城系统一体化管理,加快S2B2C平台供应链流转
  7. 【漫漫转码路】Python Day 07
  8. MySQL 纯insert_Presto Insert Mysql
  9. 怎么找计算机驱动程序不正常怎么办,网卡驱动程序不正常怎么办,小编教你解决电脑网卡驱动程序不正常...
  10. “王者”心法——经营之神王永庆独家管理秘笈