`
modabobo
  • 浏览: 506120 次
文章分类
社区版块
存档分类
最新评论

E-State:企业级状态机 - 来自ROOM的框架

 
阅读更多

正在愁怎么用状态机整理项目里的通信,找到这篇。参照一下

整理的时候用:状态表

演示的时候用状态图
实现的时候?想把状态机的实现和业务逻辑分开
应该是状态机,facade,逻辑。逻辑独立与状态机,通过facade组合进去


E-State和工作流

我在前面的文章“状态机与工作流(State Machines and Workflow)”(WLDJ,卷3,第1期)中讨论过工作流和状态机,它们是面向流程的应用程序的补充实现策略。 状态技术是对许多业务流程中所采用的“里程碑”技术所做继承的强大抽象。另一方面,工作流 - 这里特指BEA WeblogicIntegration的Business Process Modeler(BPM)组件 - 提供了重要的企业级服务,例如外部系统集成、人员工作列表(worklist)和任务管理,事件和计时器,以及XML消息处理。在前面的文章中指出过,混合的状态-工作流解决方案有以下几个部分:

1. 状态机框架,由以下部分构成:
- 状态模型: 一套状态和转换,在XML文档中表达。
- Actor数据库: 主角(actor)是指具有状态的实体。Actor的状态由状态机保存在数据库里。
- 状态机引擎: 把事件插入Actor的状态模型中,并相应地更新状态。它还会在进入、退出状态或者发生转换时,调用用户自定义动作类。
- 动作类: 用户自定义的Java类,负责响应某种状态的进入或退出,或者某个Actor在特定状态模型下执行过滤形态。

2. BPM工作流:负责接收事件,然后把事件插入状态机。

3. BPM工作流:设置计时器,在时间用尽的时候把超时事件插入状态机。

4. BPM工作流:某一状态动作调用该工作流,给它分配一个工作列表任务或与外部系统交互。

E-State 是第一部分即状态机框架的参考实现。本文来讨论状态机的体系结构。

E-State 体系结构

方法学

E-State的状态模型基于实时面向对象建模(Real-time Object-Oriented Modeling -ROOM) 的方法。ROOM 的状态图是层次结构的,也就是说每个状态可以拥有子状态。这个主意很简单,效果却异常强大。 从人类思维的角度来看,平面状态模型无法进行扩展。当状态和转换的数量增长时,平面模型就会变得难于理解。而层次状态模型则可以分部分考察,每一部分理解起来相对就变得简单了。例如,考虑图 1。

在这个模型里,转换 ab 会使状态 a1a2 变成状态 b; 而转换ac 会使状态从a1a2 变成 c。所有状态的转换toC 会使状态变成c。 在状态a1里的转换 ba 会形成新的状态 a。初始状态是 b。状态从 a1变为a2时,要经过转换a1a2,从 a2 变为a1时,要经过a2a1。转换ca把状态引到一个选择点:如果最后的状态是a1,就变成a1,否则就变成a2

同样的场景,用层次结构来表示,理解起来就容易多了,如图2所示:


首先,超级状态 a被细分为状态a1a2(图2中的右图);这样整个系统的状态图(图2中的左图)变得更简洁。从状态的高最层来看,转换abba只是在状态ab之间转换;但是在状态 a里,可以看到 ba 指向子状态a1,而 ab则来源于a1。 转换aca1a2 开始,指向c;转换 cac开始,指向 状态a的最后一个子状态。另外,转换toC不象图1中那样,要从每个状态来开始;来自最高层状态的非扩展转换点toC 的事件指向状态c,就可以表示需要的行为。

作为层次结构设计的成果之一,ROOM提供了二个强大的特性:组转换和历史恢复。所谓组转换是指:针对指定状态发生的转换,不论指定状态处在什么子状态当中;转换ac 把状态从 a 变为 c,不论状态a的子状态是a1还是 a2历史恢复 就是变回指定状态最近的子状态;转换ca 把状态 c 变回 a最近的子状态.

可以选择的方法还有UML和Petri-nets,它们都支持层次结构。

引擎

E-State的核心是一个无状态的会话Enterprise JavaBean (EJB),它被称为状态机(StateMachine),如图3中的阴影部分所示。


StateMachine EJB被配置成指向具体的状态模型,使用XML文件来进行配置,配置文件中包含以下内容:

·一组状态和一组转换;

·唯一的命名空间,唯一命名空间有助于多重部署,稍后介绍。

·Java “动作”回调类的名称,状态机处理事件时,调用回调类。

EJB把模型用于“Actor”。在ROOM方法中,Actor指的是一个“活动”对象,状态模型最好地描述了这个对象的行为。

(在 ROOM里,活动对象拥有自己的控制线程,以及一组自己的入站、出站消息接口。E-State里Actor的概念更严格) 在 E-State里,Actor是拥有状态的实体,例如一个保险索赔。在一个模型里,从一个状态到另一个状态的转换,反映了Actor的状态变化;例如,索赔可能处在等待状态,激活状态,或者空闲状态。 E-State 有三个表负责跟踪Actor的状态,这三个表是 Actor(主角)、Actor_Property(主角属性)和 Actor_State(主角状态),还有对应的实体 EJB (Actor,ActorProperty,和 ActorState) 来表示这三个表,如图3所示。StateMachine EJB 某种程度上可以看作这些实体EJB的一个层面(facade)。StateMachine EJB的Actor管理方法有: createActor(),getCurrentState(),getChildState(), getActorProperty(),getActorProperties() 和 setActorProperty()。

状态机余下的方法 (startMachine() 和 injectEvent()) 形成了状态机引擎,驱动着Actor的状态变化。实际上,startMachine()只是调用 injectEvent(),给它传递了一个特殊的“初始化”事件,由injectEvent()执行转换操作,转换操作的起点是模型中每个状态的初始转换点。所以,injectEvent() 方法是状态机的核心,由它来驱动业务流程的动作前进。这个方法可以调用用户自定义动作类,从而实现模型中所定义的状态行动(StateAction)接口。动作类的功能是将重要的状态机事件通知客户,并向客户请示逻辑决策。在表1里列出了动作类的方法。

表1 动作类的方法

方法

动作

OnStateEnter

通知进入了一个状态

OnStateExit

通知退出了一个状态

OnTransitionExecute

通知执行了一个转换。如果方法返回真,则允许该转换发生,如果为假,则阻止转换(在ROOM的概念里,称为警卫(guard))

Choice

要执行选择点决策的请求。返回值为真或假,控制着状态模型里控制分支的流转方向。

在保险索赔的例子里,动作类启动工作流,执行与任务相关的工作或者清理工作,或者启动计数器。在 WebLogicIntegration 7.0里,由BPM 的API启动工作流。在In WebLogicIntegration 8.1里,则用Web服务调用工作流。

表2里归纳了StateMachine EJB的方法。

表2 StateMachine EJB的方法

方法

动作

CreateActor

在Actor表中为StateMachine EJB代表的模型建立一个新记录

GetCurrentState

取得StateMachine EJB代表的模型的Actor的当前叶子状态

GetChildState

取得StateMachine EJB代表的模型的Actor的指定状态的当前子状态

GetActorProperty

取得StateMachine EJB代表的模型的Actor的指定属性值

SetActorProperty

设置StateMachine EJB代表的模型的Actor的指定属性值

GetActorProperties

取得StateMachine EJB代表的模型的Actor的名称、类型和每个属性的值

StartMachine

执行模型里的每个状态的初始化转换,启动StateMachine EJB代表的模型的Actor的状态模型

InjectEvent

把指定事件插入StateMachine EJB代表的模型的Actor的状态模型里

在保险索赔的例子里,插入器(Injector)工作流调用状态机的 injectEvent()方法。在WebLogic Integration 7.0里,工作流使用一个业务操作来调用这个方法,而在 WebLogic Integration 8.1,则用EJB控件来完成。

数据库架构

图4显示了保持Actor持久状态信息的表结构。.


在主表 Actor里,保存了特定 模型类型的Actor的当前状态。当前状态是指Actor目前所处的叶子状态。这个表的主键由Actor的唯一标识符和它的模型命名空间组合而成的。一个Actor可能在多个 模型命名空间里具有状态。特别的是,如果在不同的命名空间里存在着同一模型的二个版本,那么在每个命名空间里的Actor状态都能在Actor表里表示。

Actor_State表捕捉特定命名空间里的特定Actor的复合状态的活动子状态。这个表仅供内部使用,状态引擎用来来实现历史恢复。在actor和actor_state表之间存在着一对多的关系。

Actor_Property表保存特定命名空间里的特定Actor的用户自定义属性。每个属性都有一个名字(对于每个命名空间的每个Actor,名字必须是唯一的),一个类型,和一个值。这个表为客户应用程序提供了方便,可以把一组数据与角色关联;更常见的情况是,应用程序的数据保存在应用程序的数据存储机制里。

部署

StateMachine EJB会为每个状态模型部署一个不同的实例。每个实例的源代码是相同的(相同的home和 remote接口,相同的实现),但是具体的配置不同。StateMachine EJB的部署描述符指定了唯一的JNDI(Java命名和目录接口)名(客户用这个名字来定位EJB),还有一个对模型XML文件的引用。例如,保险状态模型的StateMachine EJB可能有一个 JNDI 名"state_insurance" ,并指向文件 "Insurance.xml"。要与这个模型交互,客户应用程序可以用"state-insurance"这个JNDI名来访问模型的EJB并调用EJB的方法。这个特殊的方法有着显著的优势:

·生命周期:要想准备好一个可供处理的新状态模型,需要部署一个指定该模型的StateMachineEJB。要想取消这个模型,需要取消EJB的部署。要把变化交给模型,需要用修改过的模型文件重新部署EJB。

·版本管理:如果现有的状态模型有一个新的主版本,那么新版本可以部署成独立的EJB,与以前的版本并存。

例如,“state-insurance-1.1”可以与“state-insurance”并存。

数据模型同样支持版本管理。给定的Actor有多个模型的持久状态,包括相同模型的不同版本,只有模型有不同的名称。.

大多数业务流程要运行相当长的时候,所以应用程序升级的管理变得极富挑战。有二个场景很难解决:

1.做了一个小补丁,但是有Actor正在用没有打补丁的版本运行着。

2. 做了一个主要补丁,只有新Actor可用,旧的Actor仍然使用以前的版。.

E-State 是解决这些问题聪明的解决方案:

1.应用小补丁,意味着为模型重新部署现有EJB。Actor会在停止的地方重新开始,补丁同时发挥作用。.

2.应用主要补丁,意味着用一个独立的命名空间部署新的EJB,而现在已经部署的EJB保持不变。模型彼此独立,这样老Actor用旧版本运行,新Actor用新版本运行。

结束语

E-State是由ROOM方法所启发的一个企业级状态机框架。它与BMP工作流集成在一起,提供了关键的集成服务,例如系统集成、事件、计时器、工作列表以及XML。这为开发面向流程的业务应用程序提供了强大的解决方案。E-State中包括:运行时引擎,状态模型架构,持久性服务,用户自定义“动作”类(在发生转换时,在进入或退出状态时,引擎会调用用户自定义“动作”类。)动作类调用工作流来利用BPM服务;而工作流被事件触发时,则调用引擎来触发转换。

参考资料

· Selic, Gullickson,and Ward. (1994). Real-Time Object-Oriented Modeling. Wiley.


分享到:
评论

相关推荐

    超爽的抽屉效果.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    关于学习C语言时写的代码.zip

    C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·蓝·汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,在它的主体设计完成后,汤普森和里奇用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI C”,截至2020年,最新的C语言标准为2018年6月发布的“C18”。 [5] C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

    机械臂论文.doc

    机械臂论文.doc

    S7200 and WINCC flexible.doc

    S7200 and WINCC flexible.doc

    27.大学生体质测试管理系统的设计与实现-Springboot+ Mysql+Java+ B/S结构(可运行源码+数据库+设计文

    27.大学生体质测试管理系统的设计与实现|Springboot+ Mysql+Java+ B/S结构(可运行源码(含数据库脚本)+开发文档+lw(高分毕设项目) 详细设计文档介绍链接:http://t.csdnimg.cn/jtyYh 内容概要: 系统主要分为系统管理员、教师和用户三个部分,系统管理员主要功能包括首页、个人中心、用户管理、教师管理、体质测试管理、测试报告管理、测试成绩管理、留言板、系统管理;基本上实现了整个大学生体质测试管理系统信息管理的过程。 全套项目源码+详尽文档,一站式解决您的学习与项目需求。 适用人群: 计算机、通信、人工智能、自动化等专业的学生、老师及从业者。 使用场景及目标: 无论是毕设、期末大作业还是课程设计,一键下载,轻松部署,助您轻松完成项目。 项目代码经过调试测试,确保直接运行,节省您的时间和精力。 其他说明: 项目整体具有较高的学习借鉴价值,基础能力强的可以在此基础上修改调整,以实现不同的功能。

    c语言-c语言编程基础之leetcode题解第24题两两交换链表中的节点.zip

    c语言 c语言_c语言编程基础之leetcode题解第24题两两交换链表中的节点

    电子麦克风.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    文字转语音朗读器.txt

    文字转语音朗读器.txt

    C语言学习,语言学习.zip

    C语言诞生于美国的贝尔实验室,由丹尼斯·里奇(Dennis MacAlistair Ritchie)以肯尼斯·蓝·汤普森(Kenneth Lane Thompson)设计的B语言为基础发展而来,在它的主体设计完成后,汤普森和里奇用它完全重写了UNIX,且随着UNIX的发展,c语言也得到了不断的完善。为了利于C语言的全面推广,许多专家学者和硬件厂商联合组成了C语言标准委员会,并在之后的1989年,诞生了第一个完备的C标准,简称“C89”,也就是“ANSI C”,截至2020年,最新的C语言标准为2018年6月发布的“C18”。 [5] C语言之所以命名为C,是因为C语言源自Ken Thompson发明的B语言,而B语言则源自BCPL语言。 1967年,剑桥大学的Martin Richards对CPL语言进行了简化,于是产生了BCPL(Basic Combined Programming Language)语言。

    基于Web的平面设计课程在线学习平台设计与实现-平面设计课程在线学习平台java代码-平面设计课程在线学习平台java代码-代码

    平面设计课程在线学习-平面设计课程在线学习平台-平面设计课程在线学习平台源码-平面设计课程在线学习平台java代码-平面设计课程在线学习平台设计与实现-基于ssm的平面设计课程在线学习平台-基于Web的平面设计课程在线学习平台设计与实现-平面设计课程在线学习网站-平面设计课程在线学习网站源码-平面设计课程在线学习网站java代码-平面设计课程在线学习项目-平面设计课程在线学习项目代码-平面设计课程在线学习系统-平面设计课程在线学习系统源码-平面设计课程在线学习管理系统-平面设计课程在线学习管理系统java代码-平面设计课程在线学习代码 1、技术栈:java,ssm,spring,springmvc,vue,ajax,maven,mysql,MyBatisPlus等 开发语言:Java 框架:SSM JDK版本:JDK1.8 数据库:mysql 5.7 数据库工具:SQLyog/Navicat 开发软件:eclipse/myeclipse/idea Maven包:Maven 浏览器:谷歌浏览器 2、系统的实现 用户信息 图片素材 视频素材 摘 要 I 目 录 III 第1章 绪论

    ་基于C+++OpenCV技术实现的动态目标的追踪!源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 ་基于C+++OpenCV技术实现的动态目标的追踪!源码+使用文档+全部资料(优秀项目).zip་基于C+++OpenCV技术实现的动态目标的追踪!源码+使用文档+全部资料(优秀项目).zip་基于C+++OpenCV技术实现的动态目标的追踪!源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    DSP实用教程PPT上.ppt

    DSP实用教程PPT上.ppt

    基于Android+OpenCV的司机疲劳检测项目源码+使用文档+全部资料(优秀项目).zip

    【资源说明】 基于Android+OpenCV的司机疲劳检测项目源码+使用文档+全部资料(优秀项目).zip基于Android+OpenCV的司机疲劳检测项目源码+使用文档+全部资料(优秀项目).zip基于Android+OpenCV的司机疲劳检测项目源码+使用文档+全部资料(优秀项目).zip 【备注】 1、该项目是个人高分毕业设计项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(如软件工程、计科、人工智能、通信工程、自动化、电子信息等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!

    标记view.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    Python 入门教程快速学会 Python.docx

    python入门 假设我们有这么一项任务 : 简单测试局域网中的电脑是否连通 . 这些电脑的 ip 范围 从 192.168.0.101 到 192.168.0.200. 思路 : 用 shell 编程 .(Linux 通常是 bash 而 Windows 是批处理脚本 ). 例如 , 在 Windows 上用 ping ip 的命令依次测试各个机器并得到控制台输出 . 由于 ping 通的时候控制台文 本通常是 "Reply from ... " 而不通的时候文本是 "time out ... " , 所以 , 在结果中进行 字符串查找 , 即可知道该机器是否连通 .实现 :Java 代码如下

    临写字帖.zip

    临写字帖.zip

    英飞凌PowerCode软件安装教程

    英飞凌PowerCode软件安装教程,包括下载链接和安装步骤

    仿美图秀秀拼图功能使用代码的时候,请修改2014-03big文件放到mntsdcardclothe目录下。.zip

    android 源码学习. 资料部分来源于合法的互联网渠道收集和整理,供大家学习参考与交流。本人不对所涉及的版权问题或内容负法律责任。如有侵权,请通知本人删除。感谢CSDN官方提供大家交流的平台

    本科获奖毕业论文-基于DSP的语音信号的处理.doc

    本科获奖毕业论文-基于DSP的语音信号的处理.doc

    RTKLIB上机实习资料

    有关RTKLIB资源 实习使用 参考Blog地址:https://blog.csdn.net/CUGLin/article/details/137975165?spm=1001.2014.3001.5501

Global site tag (gtag.js) - Google Analytics