本来应该继续介绍各个组件的启动流程,这里先补充下mule所使用的一些设计模式,方便从宏观上对mule的代码结构进行理解。
首先介绍的是状态机模式,该模式在mule中的使用随处可见。具体状态机管理的实现如下:
严格遵循SEDA规范,一个状态就是一个阶段,每个phase只关心当前是否可以进入该状态,接着统一调用invokePhase,在该函数中进行状态的设置以及回调函数的调用。这里使用哪个回调函数由外部传入,采用了Command模式。
针对状态之间的变迁,都需要对应的manager进行管理。针对mule context以及registry(transient registry,registry broker)有对应的lifecycle进行生命周期的管理。这三个lifecycle manager 都在mule context创建时被实例化,而spring registry的lifecycle manager在start时被实例化。
mule context没有注册单独注册其状态,而是使用默认的状态机,但是注册了状态变迁表。此时invoke的对象,在lifecycle Manager初始化是就由外部传入。
此外还会为model,connector,flow,component等实例创建对应的lifecycle manager,并触发对应实例的init函数,在init函数中设置对应的消息处理函数链,消息监听函数,并将消息注入到mule context中。针对每一个seda stage实例,都会为之创建一个事件队列。
在调用start之后,所有对象的也会通过生命周期管理触发其start函数的调用,从而完成实例的启动。
每一个含有生命周期的对象,都有对应的状态机管理器,对象需要注入其拥有的状态,以及各个状态间的转移关系,还有状态发生转移时需要进行的操作,此处操作的输入采用了command模式。
当状态发生转移时,就会触发相应的事件通知。同时进入回调之前,先记录将要进入的状态,在回调结束后,更新当前状态 。
状态转移方式:
1)直接转移:如果前后状态是可以直接转移的,那么直接调用对应的回调函数,并设置相关状态
2)间接转移:如果前后状态不可以直接转移的,那么需要调用中间状态的回调函数,并设置相关状态,最终转移到目标状态。
具体实现
通过RegistryLifecycleManager统一入口invokePhase,进行各个模块的状态触发。状态以及对应的回调,在模块初始化阶段完成。
需要初始化的模块在mule context状态转移为start时注册。目前需要启动的对象有transactionQueueManager,connector,agent,model,flowConstruct,startable等(这里是按顺序启动!针对上述对象的所有实例都需要进行初始化操作,通过类型来查找,默认情况下针对一个对象只能有一个实例,这些实例在spring的refresh过程中创建为bean实例)。不在此阶段初始化的对象有registry, mulecontext, messageSource, component, outboundRouterCollection,outboundRouter。
如果是通过web启动的,则在加载配置完成后,如果muleContext已经start则主动触发所有实例,否则触发一次muleContext的start状态转移,通过对象类型来查找对应实例进行start,这里如果是spring则调用application context来查找对应的bean。
这里使用的反射机制查找并自动执行对应实例的start方法!--invoke具体执行的方法通过getMethod方法来确定。这里由于只有一个start方法,因此通过getMethod方法获取的方法列表的首个方法就是start。如果有多个方法的话,start必须放在最前面了。
以muleContext为例,其注册的状态机如下:
其init阶段的触发是doCreateMuleContext时,手动调用执行的。
其start阶段的执行是在mulecontext初始化,配置加载完毕后,如果是独立部署则由外部主动调用start函数触发的。如果是潜入到web容器中部署,则加载配置完成后,主动调用applyLifecycle触发创建对象的start状态。
状态机模式与观察者模式紧密关联,因此下一节重点介绍观察者模式在mule中的使用。
相关推荐
this mle file is very usefull for mle program and its contained mle algorithum only
This source code is for simulating Maximum Likelihood Estimator.
MLE_朴素贝叶斯, 讲义, 最大似然估计推到很详细, 朴素贝叶斯推到二值特征。
matlab中mle代码压裂 断裂模式的量化 MATLAB 脚本用于量化岩石和其他材料中的断裂模式。 由阿伯丁大学的 Dave Healy 和其他人开发。 版本 2.8.0 2021 年 3 月。 这是最新的“官方”发布版本,并取代了 2.6 版和所有...
用于求解符合正态分布的数据的mle和me并进行画图的一个r包
这个PDF文本详细介绍了最大似然概率与最大后验概率的联系与区别,适合基础较薄弱的人学习。
python库。 资源全名:mle_training_housing-0.1.3.tar.gz
最大似然估计、最大后验概率估计、贝叶斯估计、朴素贝叶斯方法的区别
this is a cdvd hmm ... a basic paper on this topic basically deas with mle algorithm
主要介绍了LTE系统上行链路引入MIMO后的信道估计技术。
EM 算法是 Dempster,Laind,Rubin 于 1977 年提出的求参数极大似然估计的一种方法,它可以从非完整数据集中对参数进行 MLE 估计,是一种非常简单实用的学习算法。这种方法可以广泛地应用于处理缺损数据,截尾数据,...
用matlab实现基于正态分布的极大似然估计
最大似然估计MLE的matlab源码,统计学中常用的参数估计算法。
文中将极大似然估计方法讲得很详细,给出了极大似然的原理、算法、程序实现以及应用实例。
matlab中mle代码mle_rhythmicity 欢迎来到 mle_rhythmicity! mle_rhythmicity 是一组用于分析事件时间节奏的 MATLAB 工具。 它专为分析 theta (10 Hz) 节律神经元而开发,其中最常见的现有方法依赖于分箱事件时间自...
Compare_4D_MLE:代码使用最大似然(MLE)参数估计来找到四个概率分布的最佳参数:对数正态,Gumbel,γ和GEV。 该规范的主要目的是探索MLE方法在极端降雨频率分析中的优势,并针对这些分布比较该方法。 比较是基于...
最大后验估计讲得很好,很容易理解二值特征时MAP 的重要性。 其中的例子很形象。
MLE_MLE_最大似然估计_指数信号的最大似然估计_指数信号估计_频率估计.zip
APEX + MLE 一个APEX应用程序,通过MLE和GraalVM演示了服务器端JavaScript的功能应用程序下载app.sql,并将其导入到Always Free 21c数据库上的APEX 20.2实例中。例子姓名描述使用的图书馆表格验证使用表单验证,例如...