`
taupo
  • 浏览: 29414 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
社区版块
存档分类
最新评论

BAC Business Rule分析之二

    博客分类:
  • BAC
阅读更多

 

BaseRule中execute方法是规则计算的开始,但是,execute又是被谁调用的呢,特别是sample是如何从bus中取得的呢?

 

 

通过追中代码,发现,在NodeCalculatorImpl中,通过calculateDimension调用了execute,但是在calculateDimension方法中,没有做过多的逻辑处理,直接调用了excute。但是在成功调用了execute后回做一些处理,比如保存KPI的状态和结果,但是这不是今天的重点,暂时忽略。。。。

 

重点在calculateNode方法中,该方法调用了calculateDimension。calculateNode首先取得该CI的所有KPI,然后通过selecter获取sample。

 

因为rule是15秒被调用一次,所以,selecter获得sample应该是15秒之内到达bus的(可能是多个,也可能是0个),比如,BPM每1分钟运行一次,那么selecter会有3次取不到数据,所以,传入execute的sample容器有可能为空。

 

sample视乎已经取到了,但是我们的Rule如何利用这些sample呢。于是我们的另一个主角Accumulator登场了,它就好像KPI的荷包,装了和该KPI相关的sample,我们的rule就是从这个荷包里去取得sample做计算,然后把结果又保存到KPI的另外一个地方,当然这个荷包也有可能为空,什么时候为空呢,也许你已经猜到了,no data time out,right!!这个参数就是控制荷包是否为空的。比如,BPM每3分钟运行一次,如果no data timeout=30的话,那么当sample到达bus 30秒后,荷包就会被清空,也就是rule调用两次后,会发现荷包为空了,KPI状态应该为no data,也就是蓝色。。。。。。。 所以我们一般不能设置no data timeout小于DC的运行频率。

 

Accumulator分为2种:

1.SampleBasedAccumulator

2.TimeBasedAccumulator

 

第一种Accumulator我们在sample rule中已经分析了,它只保存最近的(或者根据需要保存最近的几个)sample。而

TimeBasedAccumulator会根据duration参数保存sample,比如,duration=1000,那么就保存最后一次计算到1000秒之前这段时间里的sample。

 

也许你不仅要问,KPI的荷包(Accumulator)是哪来的?现在我们来揭开神秘面纱,

我们知道BaseRule是Rule的最高父类,其子类有

                                                      ---DummyRule

                                                      ---FilterRule

                                                      ---GroupAndSiblingRule

                                                      ---LeafRule

                                                      ---TimeBasedDummyRule

 

 

这里我们以LeafRule为例作分析,因为在execute真正执行计算之前,会调用,initRuleIfNeeded对Rule做一些初始化,你也许预感到了Accumulator就是在初始化的过程中生成的。在这个方法中,首先判断Rule是否被初始化,如果已经初始化,就什么也不做(从该方法名就能看出来了。。。。),如果没有初始化,会在initRuleIfNeeded中调用internalInit方法,因为LeafRule复写了该方法,所以这里调用的是LeafRule.internalInit,代码如下

void internalInit(RuleTrinityModelAccess access, RuleNode node, RuleDimension kpi) {
        super.internalInit(access, node, kpi);
        Accumulator accumulator = getAccumulator(kpi);//第一次返回null
          if (accumulator == null) {
            accumulator = createAccumulator(access, node, kpi);//创建Accumulator,这个方法会被LeafRule的子类重写,如果是与时间相关的子类返回的就是TimeBasedAccumulator,同时就会把duration到该accumulator 种,如果不是与时间相关的accumulator ,就会创建SampleBasedAccumulator
            kpi.setStateValue(ACCUMULATOR_KPI_STATE_KEY, accumulator);//保存accumulator 到KPI中
        }
        else {
           initializeAccumulatorParameters(access, node, kpi, accumulator);//继续复用以前的accumulator ,但是会更新duration或者需要保存的sample数
        }
    }

 

显然,在该方法中,如果Accumulator 为空,根据Rule的种类创建Accumulator。不为空,就复用它。

 

 当internalInit返回后,initRuleIfNeeded继续调用init方法,该方法会根据Rule的不同类型做不同的动作,因为Rule的类型实在太多,所以就不分析了。。。最后初始化完了。

最后,就是设置KPI为 初始化 ,免得下次再初始化,然后设置初始化的时间。

 

到这里,Accumulator 创建了,Rule也已经初始化了,我们可以开始计算了,于是BaseRule.calculate被调用,因为LeafRule复写了该方法,所以这里实际调用的是LeafRule.calculate,让我们看看LeafRule.calculate到底干了什么。

 

也许你要问,sample在哪呢?在初始化的时候我们只是创建了Accumulator而已,还没把sample放到荷包呢!对,所以在LeafRule.calculate中,我们得先把荷包填满,呵呵。

 

执行这个填满荷包动作的是LeafRule.processSamples,从方法名就可以感觉到它是干什么的了,对处理sample,处理selecter千辛万苦从Bus中过滤出来的sample。

 

处理逻辑大致是:

 

如果原始sample容器(selecter选择出来的sample)不为空,会把原始容器里的所有sample加入Accumulator,你不用担心Accumulator会装不下,因为这里在加入同时,会删除过期的sample,这里的过期,可能是时间过期,也可能是个数过期(通过参数设定的最大个数),当然这是根据Accumulator的种类来判断到底是删除时间过期的sample 还是删除个数过期的。

 

如果原始sample容器(selecter选择出来的sample)为空,也要删除过期的sample。

 

 处理完sample后,rule以后就到Accumulator中去拿sample来用了,此时你发现真正的计算逻辑还是展开,对,因为我们还没判断是否是no data, 判断是否是no data就是用Accumulator里面最新的sample做时间对比了,逻辑挺简单。。。

 

如果判断是no data,就调用handleNoData做处理,如果有data,接着调用calculateKpi,计算开始啦。。。。。。。

 

 我们一般情况下也只要复写calculateKpi就OK了,至于怎么去计算,你想怎么玩就怎么玩。。。。。。

分享到:
评论

相关推荐

    Bac-to-bac表达系统中文版说明书.pdf

    2. **转化DH10Bac**:将含有目的基因的pFastBac表达质粒转化至DH10Bac细胞,Tn7转座子会在微型-attTn7位点插入,生成重组质粒。 3. **重组杆状病毒生成**:将重组质粒DNA转染到昆虫细胞,生成重组杆状病毒。 4. **...

    Bac-to-Bac杆状病毒表达系统.doc

    2. Ecoli 宿主,DH10Bac:包含杆状病毒质粒(杆粒)和辅助质粒,在转染 pFastBac 表达结构后可以产生重组杆粒。 3. 控制表达的质粒:包括 Gus 和/或 CAT 基因,以便在感染细胞后产生重组杆状病毒,表达 β-葡萄糖...

    HP BAC与SiteScope集成

    HP BAC(Business Availability Center)是HP提供的一款企业级业务连续性解决方案,集成SiteScope可以增强其监控能力。集成步骤包括: 1. **创建管理数据库**:在BAC端,通过管理-平台-设置和维护-管理配置文件...

    bac.rar_bac

    2. **算法与数据结构**:包括排序算法(如冒泡、选择、插入、快速、归并排序)、查找算法(如二分查找、哈希查找)、树和图的遍历算法等,以及链表、栈、队列、堆、图等数据结构的理解和应用。 3. **操作系统原理**...

    Android statusBar添加bac

    Android statusBar添加bac

    惠普业务可用性中心(HP BAC)

    惠普业务可用性中心(HP Business Availability Center,简称HP BAC)是一款强大的业务可用性管理解决方案,它专为Windows和Solaris操作系统设计,旨在帮助组织实现业务流程的端到端监控、管理和优化。该软件版本为...

    大数据-算法-水稻基因组BAC物理图谱构建以及省略关数据库分析查询系统的本地搭建.pdf

    本文件探讨的是大数据在水稻基因组BAC(Bacterial Artificial Chromosome)物理图谱构建中的应用,以及相关数据库分析查询系统的本地搭建。 **1. 大数据与基因组作图** 大数据在基因组学中的应用主要体现在基因组...

    Bac_to_bac表达系统中文版说明书.doc

    2. **DH10Bac Ecoli宿主**:这是一种经过改造的大肠杆菌,内置了杆状病毒质粒和辅助质粒,当pFastBac表达结构被导入后,可以生成重组杆状病毒质粒。DH10Bac细胞的微型-attTn7靶位点与pFastBac质粒中的Tn7转座子相互...

    迅饶BACnet 网关BAC1002-ARM

    ### 迅饶BACnet 网关BAC1002-ARM #### 一、产品概述 迅饶BACnet 网关BAC1002-ARM是一款高性能、多功能的网关设备,专门用于实现不同通信协议之间的转换,特别是将各种设备连接到BACnetIP网络中。该网关适用于楼宇...

    Elco-宜科 条码阅读器-BAC 48产品手册.pdf

    Elco-宜科 条码阅读器-BAC 48产品手册pdf,Elco-宜科 条码阅读器-BAC 48产品手册

    Bac-to-bac表达系统中文版说明书模板.doc

    2. **DH10Bac宿主菌**:这是一种特殊的E.coli菌株,内含杆状病毒质粒(bacmid)和辅助质粒。当pFastBac表达结构转入DH10Bac后,通过Tn7转座子的作用,可以生成重组质粒。 3. **控制表达质粒**:包括Gus和/或CAT基因...

    BACnet IP网关BAC1022-ARM

    软件特点: -绿色免安装,支持中英文; -支持60种协议同时转为BACnet IP服务器; -支持WEB浏览,查看,设置,进行监视和控制; -支持线性转换,取位,高低字节转换;...-添加新的私有协议支持BACnet,2周内即可完成.

    Bac_to_bac表达系统中文版说明书.pdf

    2. **DH10Bac大肠杆菌宿主**:这种特殊的Ecoli菌株包含杆状病毒质粒(杆粒)和辅助质粒pMON7124。当pFastBac表达结构被导入DH10Bac细胞后,Tn7转座子会将目的基因插入到微型-attTn7靶位点,从而产生重组质粒。 3. *...

    BAC-S-MOD-M配置软件使用说明.pdf

    在详细解读“BAC-S-MOD-M配置软件使用说明.pdf”文档内容后,我们可以提炼以下IT知识点: ### BAC-S-MOD-M配置软件功能及应用 1. **软件目的:** 该配置软件主要用于对BAC-S-MOD-M网关进行参数配置,包括网关的IP...

    Elco-宜科 条码阅读器-BAC500产品手册.pdf

    Elco-宜科 条码阅读器-BAC500产品手册pdf,Elco-宜科 条码阅读器-BAC500产品手册

    RS232CommunicationV2.0.zip_MATLAB RS232_RS232 matlab_V2 _bac_rs2

    Programming RS232 Communication v2.0 by Hai Bac

    BAC0:BAC0-依赖于BACpypes(Python 3)的库来为BACnet应用程序构建自动化脚本

    BAC0 BAC0是一个Python 3(3.5及更高版本)脚本应用程序,它使用处理IP网络上的BACnet消息。 该库带出简单的命令来浏览BACnet网络,从BACnet设备读取属性或对其进行写入。 Python是一种简单易学的语言,并且是用于...

Global site tag (gtag.js) - Google Analytics