WF框架编程(1)--基础部分
第一部分:基础知识
一、工作流模式
1编程模型
从消化系统讲起,口腔、肠道、胃…等消化器官组成了消化系统,每个器官又是由更微观的物质构成,比如细胞。细胞又可以细分。细胞可以分类,白细胞,红细胞等等。这里细胞可以认为是消化系统的基本组成元素。这种组成结构非常像面向对象的思维,因为它们都要解决同一个问题:现实世界复杂性。类可以认为是最基本的组成元素,类可以组成组件(构件),构件组成服务。知道了消化系统的组成,我们来看如何实现吃这个功能,吃的功能完成需要食物通过各种消化器官,使用消化器官的功能完成。这个过程是面向过程的,是一个流程。再看我们程序的实现,Staitc Main是程序的入口,C#中功能的实现也是通过调用相互关联的类中的方法实现的。C#本身就提供了丰富的控制结构(if else,while等等)。
分析:从最简单的语句到类到组件,到子系统。代码结构的最优化组织方式采用面向对象,可以更好复用,使用设计模式后可以更好控制变化。但是运行时逻辑往往是面向过程的。比如Main{}中的逻辑。就象细胞构成嘴、肠胃,这些器官又构成了消化系统,但是吃饭这个功能的完成是利用各个器官的功能,按照某种控制流程完成的。
结论:程序的目标之一是功能实现,其中实现方式是基于过程的,组织结构是面向对象的。
1.1过程控制模型
常见的过程控制模型有:1、C#语句控制流;2、XAML;3、数据库表;4、DSL(领域描述语言),图形(专用的图形工具)。数据库表中可以存储过程的调度逻辑,领域模式语言这几年也非常流行。过程的描述可以用任何一种方法实现。
1.2C#控制流程的问题
看一看交互式过程:在流转的过程中需要外部消息的响应的过程。可能某个处理会等待几天甚至几周。如果使用C#控制流实现,应该怎么实现。一般的做法是新建一个线程异布执行某个流程,而主线程持续运行(类似Windows服务),如果流程停滞,线程会被阻塞,如果阻塞的线程一多,整个系统的性能就会有很大影响,毕竟线程池等系统资源有限。这种设计可以实现,但是可扩展性和可伸缩性都存在问题。Wf处理这类问题的思路是书签机制,在线程停滞的地方加上书签,并且书签可以持久化保存到介质上,节约CLR中内存资源。管理器接收到消息后会继续流程的运转。书签可以结合Observe模式和Delegate实现。第二讲中我们可以进一步的了解到,wf的线程模型是天然的异步调用机制,可以非常好的解决这类情况。而工作流本身对过程模型的支持也强于目前的高级语言,下面的参考部分常见的工作流模式。
1.3工作流模式
工作流的概念起源于生产组织和办公自动化领域,提出的目的是通过将工作分解成定义良好的任务、角色,按照一定的规则和过程来执行这些任务并对它们进行监控,达到提高工作效率、降低生产成本、提高企业生产经营管理水平和企业竞争力的目标。工作流从更高的层次上提供了实现物料流、资金流、信息流及其涉及的相关过程与应用的集成机制,从而使得企业能够实现业务过程集成、业务过程自动化与业务过程的管理。通过定义不同任务之间相互关系的工作流模型, 无论是具体的操作动作,还是抽象的信息处理动作与决策过程,都可以用工作流的基本组成元素——活动来统一地进行描述。不同活动之间的关系,无论是具体的车间中零件加工顺序关系、办公自动化中的文件批转、还是抽象的决策流之间的关系都可以用工作流的基本组成元素——连接弧来统一的进行描述。
基于Petri网原理研究了21种工作流模式。
基本模式(5个)
顺序模式 – 按照顺序执行各项活动
解释:工作流流程中的一个活动只有当另一个活动完成后才能进行。
例子:当订单登记活动完成后,客户通知才可以进行。
并行分支模式 – 同时运行两个活动
解释:在流程中的一点一个控制线程分成可以并行执行的两个控制线程,允许两个活动可以同时运行。
例子:
同步模式 – 同步两个并行的执行线程
单选模式 – 从多条路径中选择一个执行
简单合并模式 – 合并两个二选一路径
高级分支与同步模式(5个)
多选模式 – 从多条执行路径中选出几条
同步合并模式 – 合并多条路径,如果有多条路径被选择,则进行同步;如果只有一条路径被选择,则进行简单合并
多合并模式 – 合并多条路径
鉴别器模式 – 合并多条路径而不进行同步,只执行一次后续活动
M中的N模式 – 合并多条路径,进行部分同步,只执行一次后续活动
结构模式(2个)
任意循环模式 – 没有任何限制的执行工作流
隐含终断模式 – 如果没有事情可做,就结束
多实例模式(4个)
略
基于状态的模式(3个)
推迟选择模式 – 执行两个可选线程中的一个,那个线程将被执行是隐含的
交替并行模式 – 两个活动可以以任何顺序执行,但不能并行进行
里程碑模式 – 当一个里程碑到达时,激发一个活动
取消模式(2个)
取消活动 – 取消当前活动
取消过程 – 取消该过程
参考:http://blog.csdn.net/tobeand/archive/2004/11/26/195106.aspx
Wf对工作流模式的支持
1.基于图的模式
2.导航器
3.状态机
可以构建基于wf的工作流管理系统吗?
很多人都认为wf不是工作流管理系统,只是一个工作流引擎而已。从微软的产品线来看,可以这样认为。比如:wf提供工作流引擎,SharePonit和K2等工作流管理系统的工作流引擎就是wf。那么如果我们的实际项目中需要使用工作流是否可以使用wf呢。
这是可以的。WF只是实现了非常基础的部分,可以说只是提供了工作流的编程框架。和目前已有的工作流开发平台相比,微软已经提供的Acitivity功能还是非常薄弱的。现在社区和微软都没有非常好的工作流实例。Start Kit是比较完善的一个例子,建议大家看一下。但是只要我们熟悉了WF的框架,通过自己实现一些基础功能,绝对是可以做的工作流开发平台高度的。这就是为什么要学习《WF框架编程》的意义。
按照国际工作流管理联盟(Workflow Management Coalition,WfMC) 的定义,需要我们自己实现接口1到接口5。微软的wf也提供了大量的服务,我们可以使用这些服务或按照接口约定,自己实现服务,实现完整的工作管理系统。要实现这个目标,需要先了解WFMC的工作流标准体系结构并熟悉上文的工作流参考模型。
2 WFMC的标准体系结构和工作流参考模型
2.1 WFMC标准体系结构
为了实现工作流系统的特性,达到工作流产品之间的互操作性。国际工作流管理联盟(Workflow Management Coalition,WfMC) 提出了工作流参考模型的体系结构图。
工作流系统标准体系结构模型
这为工作流的实现提供了公共的基础,组成工作流管理系统的每个功能部件可以在不同的软硬件平台上采用不同的方法实现,接口也可以在不同的软硬件平台上采用不同的设计技术和编程语言进行编程,不同的工作流产品会按照互操作和协作的不同要求在一定层次上开放其接口。
从图中可以看出,工作流管理系统主要由三类组成:
1) 软件组件:完成工作流管理系统不同组成部分功能的实现
2) 系统控制数据:工作流管理系统中的一个或多个软件组件使用的数据;
3) 应用与应用数据:对于工作流管理系统来说,它们不是工作流管理系统的组成部分,而是属于外部系统和数据,它们被工作流系统调用来完成整个和部分工作流管理的功能。
2.2工作流管理系统应该提供的功能:
按照WFMC的定义,工作流管理系统应该提供3 种功能:
1) 建立阶段的功能:主要考虑工作流过程和相关活动的定义和建模功能。
2) 运行阶段的控制功能:在一定的运行环境下,执行工作流过程,并完成每个过程中活动的排序和调度功能。
3) 运行阶段的人机交互功能:实现各种活动执行过程中用户与IT 应用工具之间的交互
2.3 WFMC参考模型
工作流执行服务器周围的接口是WAPI(Workflow APIs),通过这些接口可以访问工作流系统的服务,这些接口还控制工作流控制软件与其他系统组件间的交互。在这5 个接口中的许多功能,都是被2 个或更多个接口同时拥有的,因此WAPI 可以看作是统一的服务接口,可以交叉使用这5 个接口来支持工作流管理功能,而不是单独的使用其中某个接口
通过参考模型可以定义:符合标准的工作流系统应该能够实现接口1到接口5的这5个标准接口,即标准的工作流系统应该提供:
1.过程模型定义工具
2.工作流引擎
3.工作流任务管理器(工作流客户端)
4.用户管理监控接口
3 了解wf
了解了WFMC的工作流模型,我们再来看wf
3.1模型定义工具
过程定义包含,工作流执行软件运行过程所需的过程所有详细信息。包括过程的开始和结束条件、组成活动、在活动间进行导航的规则、需执行的用户任务、可能会被调用的应用程序、所有工作流相关数据的定义等。
过程定义可能会涉及到一个组织/角色模型,模型包含组织结构和组织中的角色等信息。从而使过程定义在,与具体活动或信息对象相关的组织实体和角色功能方面,十分详细。工作流执行服务器负责把工作流运行环境中的参与者与相应的组织实体或角色联系起来。
vs提供了工作流设计器。这个是集成到vs开发工具中的,如果要实现自己的工作流管理系统需要自己实现工作流模型定义工具,也就是工作流设计器。工作流设计器的宿主可以任选,Winfrom和Webfrom都可以,为了方便还应该提供图形化调试的功能。关于这些的具体实现,在以后章节中描述。
我们可以在设计时定义组织/角色,微软提供了和membership的角色集成,但是由于membership不支持组织结构,并且for Oracle的实现需要自己做。所以在实际应用中会受到限制。解决方法是:1、自定义membership,使它能支持组织机构或者oracle。2、通过自定义的Acitivity挂自己的权限管理模块。
任务分配考虑:
设计时基于角色分配(分配到角色)
设计时基于人员分配(分配的具体的人,或者某个分支机构中的所有人)
运行时分配(比如指定审批人,指定时实例已经运行)
WF没有任务表的概念,WF引擎也不关心流程什么时候流转,向什么地方流转。WF引擎按照状态机理论,负责控制Acitivity和WF实例的各种状态,具体请看第二部分第三节,WF调度部分。
所以是没有办法获得某个人员的待办任务之类的任务列表的。这块要自己实现。以前我的做法是在应用程序中控制,通过应用程序指定的任务进入任务列表,待办任务也是检索这个列表,整个实现和WF没有关系。但是实际运用中发现了很多问题。最好还是通过自定义Acitivity来实现任务列表。大家在跟我熟悉WF框架之后,就可以想到更好的实现。
3.2工作流引擎
WF就是一个工作流引擎。先了解下WFMC对工作流引擎的要求:
● 解释过程定义
● 控制过程实例—创建、激活、挂起、终止等
● 为过程的活动导航,可能要包含顺序或者平行的操作、最后时间期限、对工作流相关数据进行解释
● 参与者签名和退出*
● 确定任务项目,实现用户意图;提供接口,支持用户交互
● 维护工作流控制数据和工作流相关数据,在应用程序间或者用户间传递工作流相关数据
● 提供调用外部程序的接口,连接所有工作流相关数据
● 提供控制、管理和审查功能
WFMC对流程调整和流程模型的要求
按照WFMC的要求,工作流引擎要能支持串行、并行、分支、汇合、循环、同步、子流程多种关系模型;同时工作流引擎要能够实现版本控制,即业务流程的动态调整。最好能够实现下面三种方式的业务流程调整:
1、只修改单个业务流程实例的模板
2、所有正在运行的流程实例都按新的模板运行
3、已有实例仍按调整前模板运行
WF的版本控制看后续章节
流程异常处理
发生异常,流程能回退及业务补偿,暂停、取消。
超时处理
通知SMS,电子邮件...
WF需要编程实现
几个问题:
1.wf对各种关系模型如何支持的(参考文档)?
2.wf版本控制实现方式?
3.wf异常处理?
4. wf超时处理?
3.3工作流客户端
WFMC任务表
任务表—由工作流机分配给用户的任务序列。任务表处理器是一个软件组件,管理工作流参与者与工作流执行服务器间的交互,工作流参与者的签到和退出、请求过程实例的开始、任务排队等候特殊的参与者,等。在某些系统中,用户接口可能会与任务表处理器组合到一起,构成一个简单的功能实体。也可以是用户接口是一个单独的软件组件,负责提示和处理用户对话框,并控制本地用户的本地接口(参考体系结构)。
最简单的情况是,工作流机访问任务表,来把任务分配给用户;任务表处理器访问任务表,向任务表中添加任务项。有许多不同的产品来实现任务表的交互(参考模型)
在WF中没有任务表的概念。流程调度参考第三章。
在wf中有宿主的概念,工作流引擎在宿主中注册,定义相关的服务,例如持久化服务,监控服务。宿主和wf引擎通过remoting或者wcf方式通信。角色定义信息存储在.rule文件中
3.4 接口3(应用程序调用接口)
WFMC定义:
创建会话(Session Establishment)
● 连接/断开应用程序会话
活动管理功能(Activity Management Functions)
● 开始活动
● 挂起/恢复/放弃 活动
● 活动完成通知
● 信号事件
● 查询活动属性
数据处理功能(Data Handling Functions)
● 提供工作流相关数据
● 提供应用程序数据或数据地址
WF实现
wf:CallExeternalMethod,CallWebServcie
3.5 接口4
分布式多工作流引擎支持
3.6 接口5(管理监控)
WFMC的定义
用户管理操作(User Management operations)
● 建立/删除/吊销/修改用户或工作组的权限
角色管理操作(Role Management operations)
● 定义/删除/修改 角色的参与者
● 设置或取消角色属性
审查管理操作(Audit Management operations)
● 查询/打印/新建/删除审查记录或事件日志,等
资源控制操作(Resource Control operations)
● 设置/取消/修改 过程或活动并发级别
● 访问资源控制数据(数量、开始、使用参数等)
过程管理功能(Process Supervisory Functions)
改变工作流过程定义或其扩展过程实例的运行状态
● 使用/不使用 某个版本的过程定义
● 改变某一类型的所有过程/活动实例的状态
● 为某一类型的所有过程/活动实例的属性赋值
● 终止所有的过程实例
过程状态功能(Process Status Functions)
● 打开/关闭 过程/活动实例查询,设置过滤标准
● 取得过程/活动实例的详细信息
● 取得特殊过程或活动实例的详细信息
实际中应该实现的功能
1、实时跟踪工作流的运行状况
2、超时任务监控
3、跟踪查询历史工作流的处理过程?工作流异常处理
4、可执行任务改派
5、可以挂起/恢复工作流
6、可以取消工作流
7、可实现业务流程动态调整
wf对管理监控的支持:流程级和活动级的日志(TrackingService)。默认只支持保存到sql server,需要按照重新实现接口才能实现保存到oracle或者文件。默认是控制台界面的日志显示,需要图形化的监控和管理界面。
结论:WF只是实现了非常基础的部分,可以说只是提供了工作流的编程框架。和目前已有的工作流开发平台相比,微软已经提供的Acitivity功能还是非常薄弱的。现在社区和微软都没有非常好的工作流实例。Start Kit是比较完善的一个例子,建议大家看一下。但是只要我们熟悉了WF的框架,通过自己实现一些基础功能,绝对是可以做的工作流开发平台高度的。这就是为什么要学习《WF框架编程》的意义