CN1808375A - 对工作流领域中横切行为问题建模的框架 - Google Patents
对工作流领域中横切行为问题建模的框架 Download PDFInfo
- Publication number
- CN1808375A CN1808375A CN 200510099841 CN200510099841A CN1808375A CN 1808375 A CN1808375 A CN 1808375A CN 200510099841 CN200510099841 CN 200510099841 CN 200510099841 A CN200510099841 A CN 200510099841A CN 1808375 A CN1808375 A CN 1808375A
- Authority
- CN
- China
- Prior art keywords
- activity
- workflow
- assembly
- behavior
- program
- Prior art date
- Legal status (The legal status is an assumption and is not a legal conclusion. Google has not performed a legal analysis and makes no representation as to the accuracy of the status listed.)
- Pending
Links
Images
Landscapes
- Management, Administration, Business Operations System, And Electronic Commerce (AREA)
- Stored Programmes (AREA)
Abstract
选择并向组件化工作流的一部分应用行为组件。该行为组件向由用户选择的工作流的该部分定义了出错和异常处理以及其它问题。在工作流的执行期间,行为组件响应于来自工作流的所选择部分的输出而执行。
Description
相关申请的参照
本申请要求2004年10月1日提交的美国临时专利申请第60/615,537号的优先权。
技术领域
本申请的实施例涉及工作流建模领域。更为具体地,本发明的实施例涉及组件化和可扩展工作流模型。
背景技术
现有系统试图通过对商业问题建模而将商业问题映射到高级工作流。然而,真实世界的工作流在各方面都有所不同,这些方面诸如(a)执行和建模的复杂性、(b)设计时对工作流的结构的知识、(c)静态定义或特别/动态、(d)在其生命周期中各点创作和编辑该工作流的简易性、以及(e)与核心工作流过程的弱或强商业逻辑关联。现有模型无法容纳所有这些因素。
此外,大多数现有工作流模型是以基于语言的方法(例如,BPEL4WS、XLANG/S和WSFL)或基于应用程序的方法为基础的。基于语言的方法是具有一闭合的预定义构造集的高级工作流语言,它帮助向用户/程序员建模该工作流过程。工作流语言载有供该闭合构造集使用的所有语义信息,以使用户能够构建工作流模型。然而,语言无法由开发者来扩展,且表示构成该工作流模型的闭合的原语集。语言被绑定到由工作流系统销售商发货的语言编译器。仅该工作流系统产品销售商可通过在该产品的未来版本中用一新的构造集扩展该语言来扩展该模型。这通常要求升级与该语言相关联的编译器。
基于应用程序的方法是这样一种应用程序,它在该应用程序内具有工作流能力以解决领域专用问题。这些应用程序不是真正可扩展的,也没有可编程模型。
采用现有方法,复杂性、预知、动态工作流、创作简易性以及与商业逻辑和核心工作流的关联强度等问题未被充分地解决。没有可扩展、可定制以及可重新主宿工作流设计器框架可用于构建可视工作流设计器来对不同的工作流类别建模。现有系统缺乏一种快速应用程序开发(RAD)风格工作流设计体验,它允许用户图形地设计工作流过程,并以开发者选择的编程语言来关联商业逻辑。另外,没有启用了墨迹的工作流设计器。
另外,现有系统无法提供用于执行工作流的无缝特别或动态编辑。工作流过程在本质上是动态且移动的,且其形式不能在设计时完全预见。该工作流过程以结构化方式起始,并最终在其执行生命周期过程中发展和改变。需要一种允许工作流构建者能够在设计时创作各种类型的工作流模型,以及以无缝的方式对运行的工作流做出特别或动态改变的工作流创作框架。即使在部署了工作流过程之后且该工作流过程正在运行,商业需求的变化通常迫使改变或编辑当前运行的工作流过程。需要一种提供工作流过程的运行时创作的系统。
另外,工作流过程处理跨越工作流过程模型的多个步骤的横切的、互不相关且紊乱的问题。例如,尽管工作流过程的各部分被设计成参与长期运行的事务,然而同一过程的其它部分被设计成用于并发执行。同一工作流过程的另外一些部分要求跟踪,而其它部分处理商业或应用程序级例外。需要向工作流过程的一个或多个部分应用特定的行为。
某些工作流建模方法是不实用的,因为它们需要整个商业过程的基于流的完整描述,包括所有例外以及人类干预。这些方法中的一些提供了当出现例外时的附加功能,而其它方法独占地采用基于约束的方法而非基于流的方法来对商业过程建模。现有系统实现基于流或基于约束的方法中的任一种。这些系统该不灵活,以致于无法对许多常见商业情况进行建模。
因此,需要一种组件化且可扩展的工作流模型来解决这些和其它缺点的一个或多个。
发明内容
本发明的实施例提供了一种用于构建组件化工作流模型的可扩展框架。具体地,工作流过程中的每一步骤具有描述工作流步骤的设计时方面、编译时方面以及运行时方面的相关联组件模型。此外,任何开发者可通过创作这些组件来扩展核心工作流模型。本发明包括一工作流引擎,它足够灵活和强大来协调各种工作流的执行,包括高度形式的机器到机器过程、基于约束的特别人类工作流、以及具有基于流和基于约束的方法的混合的工作流。该工作流引擎准许对执行工作流的激活、执行、查询和控制能力。例如,本发明准许对执行工作流的特别和动态改变。该工作流引擎可以在包括服务器和客户机环境两者的各种宿主环境中重新主宿或嵌入。每一特定宿主环境将工作流引擎与一组服务提供者相结合。服务提供者的总能力确定了可在该特定宿主环境中执行的工作流的种类。
本发明的其它实施例提供了一种用于序列化工作流模型的声明性格式,诸如可扩展配合(orchestration)标记语言(XOML)。该声明性格式使用户能够通过编写一组组件来扩展工作流模型。对应于工作流过程的各步骤的语义被封装在活动确认器组件中,该组件在编译时确认并实施给定组件的语义。本发明的声明性格式的实施例还能够进行数据声明以及与工作流模型的各元素的数据相关。该声明性格式支持数据通过工作流的变换。例如,该格式声明性地表示外部数据源,如数据库或文件、代码片断以及工作流模型内的商业规则。
本发明的一个实施例提供了一种构建图形/可视工作流设计器的可扩展、可定址以及可重新主宿的工作流设计器框架,以对不同类别的工作流建模。本发明的另一实施例支持快速应用程序开发风格的工作流设计体验,以允许用户图形地设计工作流过程,并以任何编程语言来关联商业逻辑。本发明的实施例也使用笔和图形输入板技术提供了墨迹支持。本发明提供了一种自由形式的绘图表面,其中,由用户绘制的工作流被转移到内部表示。本发明支持通过在现有绘图表面上的墨迹编辑(例如,添加/删除活动)以及现有工作流的墨迹注释(例如,书写表面上的注解、建议或提醒等手绘物)对工作流的创建和修改。
本发明的其它一些实施例提供了用于以声明性方式捕捉横切行为并将行为应用于工作流模型的选中部分的组件。本发明的其它实施例在与其相关联的行为的上下文中执行工作流模型的选中部分。本发明的实施例提供了处理工作流模型的多个步骤的横切的、互不相关且紊乱的问题的框架、可重新使用组件和语言。
依照本发明的一方面,一种计算机实现的方法向工作流中一个或多个选中的活动应用出错和异常处理。该计算机实现的方法包括选择预定义的行为组件。该方法还包括选择工作流中的一个或多个活动。该方法还包括将所选中的行为组件与所选中的活动相关,以使所选中的行为组件能够响应于所选中的活动而操作。
依照本发明的另一方面,一个或多个计算机可读介质具有用于向工作流中一个或多个选中的活动应用出错和异常处理的计算机可执行模块。该模块包括用于选择预定义行为组件和用于选择工作流中一个或多个活动的设计器模块。该模块还包括用于将由设计器模块选择的行为组件和活动组件相关以使选中的行为组件能够响应于选中的活动而操作的上下文模块。该模块还包括用于根据由上下文模块相关的行为组件执行由设计器模块选择的活动的运行时引擎模块。
依照本发明的又一方面,一种系统向工作流中的一个或多个选中的活动应用出错和异常处理。该系统包括储存具有定义的接口的多个活动的存储器区域。该存储器区域还储存多个行为组件,其每一个符合所定义的接口。每一行为组件与至少两个活动相关。该系统还包括被配置成执行计算机可执行指令的处理器,该指令用于从用户接收对储存在存储器区域中的行为组件之一的选择、从用户接收对储存在存储器区域中的至少两个活动的接收、创建与所选择的行为组件相关联的上下文、以及在所创建的上下文中执行所选择的活动。
可替换地,本发明可包括各种其它方法和装置。
其它特征部分是显而易见的,而部分将在后文指出。
附图说明
图1是包含任务和控制流合成活动的示例性工作流。
图2示出了一个示例性活动继承树。
图3示出了一个示例性组件模型。
图4示出了一个示例性组件模型生命周期。
图5是用于创作依赖于工作流规范的向导的工作流的高级应用程序用户界面。
图6示出了一个示例性工作流设计器。
图7示出了包括接收活动及其后的发送活动的配合程序。
图8示出了可视工作流、工作流的XOML序列化表示以及工作流的分离代码之间的进度表定义和关系。
图9是示出其中可实现本发明的合适的计算系统环境的一个示例的框图。
附录A描述了示例性活动。
贯穿附图,对应的参考符号指示对应的部分。
具体实施方式
本发明的实施例对表示诸如商业过程等过程的工作流进行建模。商业过程是导致可预测和可重复结果的依赖性和有序的任务、活动等。包括组织的操作过程、机构的工作知识以及信息资源,商业过程被设计成以有效且及时的方式满足所定义的商业目标。在一个有效的环境中,过程的功能性组件可被容易地标识、适应和部署来解决不断改变的企业需求。工作流是与商业过程中的任务交互的最终用户的体验。任务被建模为活动、组件等,其每一个表示由个人或机器执行的工作单元。在一个实施例中,向用户呈现多个活动。用户选择并组织活动来创建工作流。执行所创建的工作流以对商业过程建模。参考图1,示例性工作流100包含任务和控制流合成活动。
在一个示例中,配合引擎工作流模型支持不同类别工作流的建模、创作和执行。示例包括按照出现在有序序列中或作为一组异步事件出现的一组结构化步骤对给定问题建模。该配合引擎协调进度表的执行。进度表是以树形结构分层排列的一组经组织的活动。执行活动的执行上下文以及对其可见的共享数据由一作用域提供。每一活动表示封装工作流过程中步骤元数据的组件。活动是工作流模型中的基本执行单元,且具有相关联的属性、句柄、约束和事件。每一活动可以由任何编程语言中的用户代码来配置。例如,用户代码可表示以公用语言运行时环境(CLR)语言书写的商业或应用程序逻辑或规则。每一活动支持对用户代码中的执行的预截听(pre-interception)挂钩和后截听(post-interception)挂钩。每一活动具有相关联的运行时执行语义和行为(例如,状态管理、事务、事件处理和异常处理)。活动可与其它活动共享状态。活动可以是原语活动或被组合成合成活动。原语或基本活动没有子结构(例如,子活动),并由此是树结构中的叶节点。合成活动包含子结构(例如,它是一个或多个子活动的父节点)。
在一个实施例中,活动有三种类型:简单活动、容器活动和根活动。在本实施例中,在模型中有一个根活动,且根活动中没有或有任何数量的简单活动或容器活动。容器活动可包括简单或容器活动。整个工作流过程可用作构建更高阶工作流过程的活动。此外,活动可以是可中断或不可中断的。不可中断合成活动不包括可中断活动。不可中断活动缺少可导致活动阻断的服务。
配合引擎提供一组示例性的活动。参考图2,一活动继承树示出了若干示例性活动。图2列出的示例性活动在附录A中更详细地描述。另外,任何用户可编写一个或多个活动来扩展工作流模型。例如,用户可为特定的商业问题、领域、工作流标准(例如,商业过程执行语言)或目标平台编写活动。配合引擎可向用户提供一组丰富的服务来编写活动,该组服务包括,例如分析代码、类型分解和类型系统的服务、用于序列化和呈现的服务。
在一个实施例中,每一活动具有至少三个部分:元数据、实例数据和执行逻辑。活动的元数据定义了可被配置的数据属性。例如,某些活动可共享在活动抽象基类中定义的一组公用元数据。每一活动依照其需求通过扩展该类来声明其自己的附加元数据属性。
元数据属性的值由该活动跨配置该活动的进度表的实例的所有实例共享。例如,如果用户创建进度表A,并向其添加一发送活动,则该发送活动被给予标识信息(例如,“001”)作为其元数据的一部分。添加到该进度表的第二发送活动将接收其自己的唯一标识信息(例如,“002”)。一旦创建和执行了进度表A的多个实例,则发送“001”的所有实例将共享元数据值。相反,活动的实例元数据定义了一组对运行进度表实例中的活动实例专用的数据。例如,延迟活动可提供其实例数据上的只读属性,该实例数据是标识延迟活动的超时值的日期和时间值。一旦延迟活动开始执行,该值即可用,且它对延迟活动的每一单个实例很可能是不同的。通常参考进度表的实例,尤其是活动和任务的实例,而不用“实例”来限定参考。
合成活动具有其子活动组作为另一元素。子活动在一个实施例中被认为是元数据。配合引擎模型明确地准许在运行时在进度表的实例中操纵该元数据。向作为执行进度表实例的一个部分的合成活动添加新的子活动,使得仅该进度表实例的元数据(活动树)被影响是可能的。
接下来参考图3,每一活动具有一组相关联的组件,它们形成了该活动的组件模型。该组相关联的组件包括活动执行器、活动设计器、活动序列化器、活动确认器(例如,语义检查器)、以及活动代码生成器。活动执行器是实现该活动的执行语义的无状态(stateless)组件。活动执行器与活动的元数据一起工作来实现该活动。代码调度器担当活动执行器的服务提供者以向活动执行器提供服务。
活动设计器可视地显示活动的设计时可视表示。活动设计器是设计器分层结构中的一个节点,并且可以加主题或加皮肤。活动设计器主宿在设计环境中(例如,应用程序),并通过服务与宿主设计环境交互。活动确认器在编译时以及运行时实施活动语义。活动确认器在工作流模型的上下文中操作,并使用由该环境提供的服务(例如,编译器、设计器或运行时环境)。确认在工作流生命周期中的各个点发生。结构依从性检查在创建工作流的序列化表示时、编译时或响应于用户请求而做出。语义检查可以在运行时比在编译时执行的检查更强大,以确保诸如运行实例的活动树中活动的添加和替换等运行时操作的安全性。本发明评估与每一活动相关联的语义,以找出例如与预定接口要求的一致性和依从性。
活动序列化器是序列化活动元数据的组件。活动序列化器从各种模型/格式序列化器中调用。整个工作流模型是基于一可扩展模式被序列化成声明性标记语言的,它可以按需进一步被转换成其它工作流语言。
在一个实施例中,活动的组件模型作为数据结构储存在计算机可读介质上。在该数据结构中,活动设计器由储存用于可视地表示该活动的数据的图像字段(例如,图标)表示。另外,一个或多个创作时字段储存定义与活动相关联的属性、方法和事件的元数据。活动序列化器由储存用于将储存在创作时字段中的元数据传送到活动的声明性表示的数据的序列化器字段表示。活动生成器由储存与储存在创作时字段中的元数据相关联的软件代码的商业逻辑字段来表示。活动执行器由储存用于执行储存在商业逻辑字段中的软件代码的数据的执行器字段表示。
作用域和进度表
执行活动的执行上下文以及对其可见的共享数据由作用域来提供。作用域是核心活动之一。作用域是用于将变量和长期运行服务与事务语义、出错处理语义、补偿、事件处理程序和数据状态管理集合在一起的统一构造。作用域可具有相关联的异常和事件处理程序。在一个实施例中,作用域可以是事务的、原子的、长期运行的或同步的。在对用户变量的冲突读-写或写-写访问的情况下,向用户提供并发控制。作用域也是事务边界、异常处理边界以及补偿边界。由于作用域可以在进度表内嵌套,因此用不同作用域内相同的名字(即使作用域是嵌套的)来声明变量、消息、通道和相关集而没有名字冲突也是可能的。
在进度表内嵌套的作用域只能在该进度表的上下文内执行。进度表可以被编译为应用程序(例如,独立的可执行实体)或库(例如,用于从其它进度表调用)。被编译为库的每一进度表有效地构成了可从其它进度表内调用的新活动类型。进度表的元数据包括参数的声明。
一旦开发了进度表,可执行所开发的进度表的实例。激活和控制进度表实例的过程是由其中嵌入了配合引擎的宿主环境所决定的。配合引擎提供了可用于测试进度表的不提供必要服务的“简单宿主”。另外,配合引擎提供了一激活服务来促进同样由引擎和外部应用程序用于与服务环境(即,宿主)交互的“服务提供者”模型(例如,应用程序编程接口)的标准化。激活服务创建了特定进度表类型的进度表实例,并可任选地传递参数。进度表实例本质上是运行进度表实例的代理,并包括唯一地标识该实例的标识符、对进度表的元数据(活动树)的引用、以及挂起、恢复和终止实例的方法。激活服务也支持基于给定的进度表实例标识符找出进度表实例。
代码分离(code-beside)
作用域活动可具有包括用于该作用域活动的商业逻辑的相关联的代码分离类。由于进度表本身是作用域,因此进度表也可具有代码分离的类。在进度表内嵌套的作用域也可具有其自己的代码分离类。在作用域内嵌套的活动共享该作用域的代码分离类,它担当其共享数据的状态和商业逻辑的容器。例如,代码活动的元数据包括对具有代码分离中的特定签名的方法的引用。在另一实例中,发送活动的元数据包括对特定签名的代码分离方法的可任选引用加上对消息声明和通道声明的强制引用。
代码分离的示例性使用包括:变量、消息、通道和相关集的声明;出/入/引用参数的声明;附加自定义属性的声明;要发送的消息的准备;已接收消息的处理;以返回布尔值的代码表达的规则的实现;本地定义的变量的操纵;读活动元数据和实例数据;写活动实例数据(例如,设置将要执行的活动的属性);引发事件;抛出异常;枚举和导航运行进度表实例的活动树中的活动的分层结构,包括跨嵌套的作用域和进度表调用边界;向运行进度表实例内的合成活动添加新活动;改变与运行进度表实例内的活动相关联的声明性规则;以及获取对其它运行进度表实例的引用和对其的操纵。
行为组件
本发明的配合引擎允许开发按照跨越工作流活动的行为对交错的、互不相关问题建模。交错或紊乱的问题的示例包括事务(例如,分布式事务协调器和长期运行)、并发性、跟踪、持久性、出错处理、日志记录等等。向工作流过程建模应用行为组件允许复杂的过程模块化,并允许构建可重复使用的、极其灵活且反应灵敏的工作流过程。它不仅有助于将系统级问题具体化(例如,进程监视、跟踪、持久性、事务和同步),也有助于基于运行过程的声明性准则和/或状态将商业级问题具体化(例如,基于服务质量准则动态地选取web服务,以及在运行的过程中有条件地跳过、替换、重复、添加或移除一组执行步骤以履行商业合同等等)。
应用行为组件提供了更好的模块化模型,并有助于分隔横切任何程序或基于组件的系统的紊乱问题。横切问题在被称为行为组件的模块性边界内捕捉。行为组件提供横切功能。一般而言,只要所编程的两个属性必须被不同地创作但仍需协调,这两个属性就彼此横切。如果任何实现的属性可被干净地封装或良好地定位、容易地访问、并且在必要时在广义过程(例如,对象、方法、过程、API)中创作,它就被定义为组件。在一个示例中,组件是系统的功能分解的单元,诸如图像过滤器、银行账号、图形用户界面小部件、或工作流模型中的步骤。
跨越工作流活动的横切问题可以被表示为工作流行为组件。工作流行为组件可以被视为声明性模块构造。这些行为组件被叠加到工作流应用程序或应用程序的各部分上。这些是声明性的,因为它们以声明性的方式来图式化和描述。
事务、同步和异常处理是极不适合于被建模为合成活动的示例性行为特性/问题。这些是跨越且横切活动和商业逻辑的互不相关的问题。这些如同诸如跟踪、记录和追踪等其它问题一样基本上在本质上是横切的。示例性建模规则包括如果执行逻辑可被干净地封装为组件,则将任何执行逻辑表示为活动,以及如果语义跨越一组活动或组件,则将行为问题表示为行为组件。
行为组件和活动共享关于其组件模型的相似性。与活动一样,每一行为组件按照属性、方法和事件声明性地描述其元数据。另外,每一行为组件具有相关联的设计器、序列化器和运行时组件。然而,在一个实施例中,实际实现行为/语义的运行时组件与活动执行器不同。例如,调度器和行为组件执行器之间的接口合约与行为执行器不同。
示例性行为组件涉及以下的一个或多个:出错处理、异常处理和消息通信。例如,行为组件可包括作用域组件和过程组件。作用域组件涉及以下的一个或多个:过程分析、状态管理、事务、同步以及异常出错处理。过程组件涉及以下的一个或多个:事务处理、同步和异常出错处理。
行为组件表示跨越活动边界的横切问题。活动驻留在行为组件内,并且依赖于该排列,继承行为组件的行为。例如,如果活动驻留在原子事务行为组件内,则它在其执行期间继承ACID语义。另外,DTC事务在其执行期间也在传递给它的上下文中可用。
在一个实施例中,活动参与多个行为组件。具体地,一个活动生存在被称为上下文的一组行为组件的并集中。上下文是由一组包含1-n个行为组件的并集定义的区域。在编译时要求每一行为组件确认其自身。它接收上下文,从该上下文中,它可获得所有其它兄弟方面的列表、包含在上下文中的活动等等。确认和错误传播类似于活动的确认和错误传播。
在运行时,调度器给予上下文的每一行为组件执行器解释和实现行为组件支持的行为的机会。在一个实施例中,在活动的执行期间发生以下操作。
-调度器通过读取对象模型按需创建适当的方面。
-调度器通过询问行为组件(BehavioralComponentExecutor.GetService())并将其推入服务容器中来创建适当的服务。
-调度器调用BehavioralComponentExecutor.Load(),给予行为组件初始化其自身的机会。
-调度器在其中放置了活动的上下文的每一行为组件上调用PreProcess(),然后调用ActivityExecutor.Execute(),传递ContextService(上下文服务)。
-调度器在每一吞没(engulfing)行为组件上调用AspectExecutor.Unload。
参考图4,一框图示出了示例性组件模型生命周期。用户与储存在一个或多个计算机可读介质上的计算机可执行模块交互,以向工作流中一个或多个选中的活动应用出错和异常处理。计算机可执行模块包括选项板模块408、设计器模块402、上下文模块404、运行时引擎模块406。用户与选项板模块408交互以定义行为组件。行为组件包括描述该行为组件的功能的用户可编辑元数据。用户与设计器模块402(例如,用户界面)交互以选择预定义的行为组件,并选择工作流中的一个或多个活动。用户还与上下文模块404交互,以将通过设计器模块402选择的行为组件和活动相关,以使选中的行为组件能够响应于所选中的活动而运作。即,设计器模块402使选中的行为组件能够响应于选中的活动的执行而执行操作。例如,选中的行为组件可捕捉由选中的活动之一抛出的异常或出错。一般而言,选中的行为组件响应于来自选中活动的输出而执行操作。用户与运行时引擎莫跨跨406教育,以根据由上下文模块404相关的行为组件执行通过设计器模块402选择的活动。运行时引擎模块406与选中的行为组件协调地执行选中的活动。例如,运行时引擎模块406创建与选中的行为组件相关联的上下文,并在所创建的上下文内执行选中的活动。在一个实施例中,行为组件包括一个或多个规则,并且选中的行为组件将规则应用于选中的活动。
本发明也支持向其应用行为组件的活动的钉子。在一个示例中,本发明包括从用户接收具有与其相关联的一个或多个语义的用户定义的活动、评估该语义以找出与预定义接口要求的一致性、以及根据该评估在由运行时引擎模块406创建的上下文内执行所接收的用户定义的活动。
在诸如图4所示的系统中,存储器区域储存多个活动,其每一个具有定义的接口以及多个行为组件,每一行为组件符合定义的接口。每一行为组件与一个或多个活动相关。存储器区域还包括每一行为组件的数据结构(例如,组件模型)。示例性数据结构包括属性、方法、事件、设计器、序列化器和/或运行时组件。另外,该系统包括被配置成执行计算机可执行指令的处理器,该指令用于从用户接收对储存在存储器区域中的行为组件之一的选择、从用户接收对储存在存储器区域中的至少两个活动的选择、创建与所选择的行为组件相关联的上下文、以及在所创建的上下文内执行所选择的活动。
一个或多个计算机可读介质具有用于执行此处所描述的方法的计算机可执行指令。
工作流模板(stencil)
工作流模板(例如,工作流样板或活动包)包括根活动和一组活动。模板可以是域或宿主专用的。模型的示例包括结构化的工作流模板、人类工作流模板以及非结构化的工作流模板。某些模板可以作为一组活动是“闭合的”,包括被设计成可能在特定的宿主环境中共同工作的一个或多个根。其它模板可能是“开放”到各种程度的。模板定义了其可扩展性点。例如,开发者编写CustomRoot(自定义根)和新的抽象CustomActivity(自定义活动),并声明包是CustomRoot加上从CustomActivity导出的任何活动。
示例性BPEL或XLANG/S模板包括具有以下特征的根活动:状态管理和事务中的参与具有相关联的事件和异常处理程序、支持合约第一模型、可被分析、并具有定义良好的激活和终止行为。示例性模板还包括一组消息通信专用活动(例如,Send(发送)和Receive(接收)及其变体),以及诸如Scope(作用域)、Loop(循环)、Condition(条件)、Listen(监听)和Throw(抛出)等其它结构化活动。
一个示例性Halifax模板包括具有以下特征的根活动:隐含状态管理、相关联的异常处理程序(0-n)、支持基于事件的模型、具有良好定义的激活行为、以及具有未定义的终止。根活动包含0-n个EventDriven(事件驱动)活动。每一EventDriven活动表示一个Halifax活动。每一EventDriven活动具有相关联的状态管理协议并在原子作用域内执行。
设计器框架(用户界面)
配合引擎提供了用于以WYSWYG方式设计各种类别的工作流模型的框架。例如,参考图5,一种用于创作工作流的高级应用程序用户界面依赖于工作流规范的向导。该框架包括使开发者能够编写可视工作流设计器的一组服务和行为。这些服务提供了呈现工作流过程的有效方式、支持用于绘制工作流的墨迹/图形输入板、以及支持诸如撤消/回复、拖/放、剪切/复制/粘贴、缩放、扫视、搜索/替换等设计器操作、书签、装饰、用于确认错误的智能标签、用于活动的有效拖动目标指示符、自动布局、视图分页、导航标记器、拖动指示符、具有页眉/页脚的打印和预览等等。通过这一用户界面,可构造包含任务和控制流合成活动(例如,顺序、并行和条件)的简单工作流。对规则规范(例如,条件分支逻辑、while循环逻辑)或数据流规范(例如,任务A的输出是任务B的输入)不要求代码输入(或依赖于现有的已编译代码)。进度表的序列化表示(包括规则和数据流)是自包含的,且在不需要代码分离的某些情形中完成。
使用本发明的设计器框架,本发明的配合引擎包括一种快速应用程序开发(RAD)风格的可视工作流设计器,它支持以可视方式将软件代码与工作流模型相关联。工作流中的每一活动具有相关联的活动设计器。每一活动设计器是按照框架服务来编写的。本发明的框架也包含一可视设计器模型。该可视设计器模型包括通过该工作流模型中的关系彼此链接的一组活动设计器。图6示出了一个示例性工作流设计器。本发明包括将代码与工作流模型相关联的各种模式,包括“代码分离”、“代码嵌入”和允许用户代码实时在工作流模型中往返的“仅代码”。本发明也提供了当用户在构建工作流时的实时语义错误。
在一个实施例中,本发明向用户呈现了标识设计器框架用户界面中的多个活动的包。本发明还从用户接收对所呈现的活动的选择和分层组织。本发明序列化所接收的活动来创建工作流的持久表示。本发明还从用户接收表示用于与工作流中的多个活动之一相关联的商业逻辑的软件代码。本发明也可接收具有与其相关联的一个或语义的用户定义活动。本发明包括用于评估语义以找出其对预定义接口要求的一致性的语义检查器或确认器。如果语义与预定义的接口要求相一致,则本发明呈现该用户定义的活动作为多个活动之一。本发明还编译软件代码来创建一个或多个二进制文件。例如,本发明将序列化的工作流表示和软件代码编译成包含工作流的可执行表示的单个程序集(assembly)。本发明执行所创建的工作流。在一个实施例中,一个或多个计算机可读介质具有用于执行该方法的计算机可执行指令。
配合引擎设计器允许用户通过使用其它所创建的进度表来递归地组成更高阶进度表并使用它们。进度表的内联扩充允许用户内联地查看进度表内容并剪切或复制内容。为允许进度表的内联扩充以及使进度表只读,创建用于内联进度表的单独设计表面和设计器宿主。此外,合成进度表设计器具有其自己的分层结构。所调用的进度表在设计器由用户扩充时被加载和显示。在一个实施例中,当活动被放到或复制到设计器表面上时,层叠设计器。一属性将调用活动设计器与主宿的进度表的根设计器链接。以下函数防止向设计器添加或移除活动。
internal static bool AreAllComponentsIn WritableContext(ICollection components)
internal static bool IsContextReadOnly(IServiceProvider serviceProvider)
这些函数由基础结构调用以检查其中插入活动的上下文是否为可写的。对于主宿的设计器,这些函数返回假。另外,防止属性被修改。其它函数从适当的组件中取出活动设计器:
internal static ServiceDesigner GetSafeRootDesigner(IServiceProvider serviceProvider)
internal static ICompositeActivityDesigner GetSafeParentDesigner(object obj)
internal static IActivityDesigner GetSafeDesigner(object obj)
在一个示例中,用户创建进度表并将其编译为活动。在成功地编译之后,该进度表出现在工具箱中。用户打开或创建其中需要所编译的进度表的进度表。用户从工具箱中拖放所编译的进度表。在设计表面上示出层叠的进度表设计器。当用户希望查看放下的所编译的进度表的内容时,用户扩充进度表设计器以用只读的状态示出内联的所调用的进度表的内容。所调用的进度表的内联使用户能够查看所调用的进度表,而无需在不同的进度表设计器之间切换。该特征对于通过重复使用现有进度表来组成更高阶进度表的开发者而言是有用的。
对使用主题/皮肤的设计器框架的定制的支持
使用设计器框架编写的工作流设计器可使用工作流主题来定制。这些可以是声明性地描述设计器的各方面的可扩展标记语言(XML)文件。工作流设计器提供伙伴扩展活动的向导支持。工作流设计器支持的示例性用户界面特征包括,但不限于,撤消/恢复、拖/放、剪切/复制/粘贴、缩放、扫视、搜索/替换、书签、装饰、用于确认错误的智能标签、用于活动的有效拖动目标指示符、自动布局、视图分页、导航标记器、拖动指示符、具有页眉/页脚的打印和预览、以及文档大纲综合。工作流设计器支持自定义的设计器主题/皮肤来允许使用XML元数据定制设计器的外观和感觉。工作流设计器支持后台编译。在一个实施例中,提供了在设计进度表时用于确认错误的智能标签和智能动作。工作流设计器可主宿在任何容器中(例如,应用程序、外壳等)。
一个示例性配合引擎程序包括接收活动以及其后跟随的发送活动。该过程接收消息并将其发送出去。用户创建名为“Hello World”的项目,并向该项目添加配合项。用户然后将作用域活动拖放至设计表面。下一步,用户将接收活动以及其后的发送活动放到该作用域上。图7示出了设计器中的所得工作流700。每一活动设计器提供了对象模型上的用户界面表示。开发者能够直接对对象模型编程,并设置活动上的属性或使用该设计器。配合引擎设计器允许开发者从工具箱中选择活动并将其拖到设计器表面上。如果活动已被放置到进度表中并需要移动,则开发者能够选择它(通过点击它)并将其拖至它需要去往的进度表区域。如果开发者按住ctrl键并同时进行拖放,则做出所选中活动的副本。
积极放置提供了可能的拖动点(目标)作为设计表面上的可视指示器。自动滚动也参与在拖放的上下文中。当处理大型进度表时,到当前不在视见区中的设计器区域的导航可通过将该活动拖向要放置的进度表区域来访问。
拖放可跨统一项目中的进度表以及跨统一解决方案中的其它项目中的进度表得到支持。在活动被放置到设计表面上之后,开发者配置该活动。每一活动具有一组属性,开发者配置该属性以使进度表有效。这些属性可在属性浏览器中编辑。每一活动控制什么属性在属性浏览器中是可查看的。为帮助开发者配置各活动,设计器提供了各种对话框或“子设计器”。对活动的各属性调用每一对话框。
配合引擎能够定制工具箱中呈现的活动。当开发者创建自定义活动或进度表时,最终的结果是程序集。使用对话框,开发者能够浏览程序集位置并选择该程序集以使其作为配合引擎活动出现。或者,开发者可将程序集放置在配合引擎安装路径中,且它作为配合引擎活动呈现。
应用程序编程接口(API)
在另一实施例中,本发明提供了用于执行各种工作流操作的应用程序编程接口(API)。本发明包括用于创作工作流的设计应用程序编程接口。设计应用程序编程接口包括用于创作工作流的装置以及用于选择一个或多个活动来创建该工具流的装置。本发明也包括用于编辑经由设计应用程序编程接口创作的工作流的编译应用程序编程接口。编译应用程序编程接口包括用于序列化工作流的装置、用于定制工作流的可视外观的装置、用于编译经由设计应用程序编程接口创作的工作流的装置、用于确认工作流的装置。
本发明也包括用于将类型与工作流中的每一活动相关联的类型提供者应用程序编程接口。类型提供者应用程序编程接口包括用于将该类型与工作流中的每一活动相关联的装置,以及用于将一类型与工作流中的每一活动相关联的装置。
一个或多个API构成了用于创作工作流的示例性装置、用于选择一个或多个活动来创建工作流的示例性装置、用于序列化工作流的示例性装置、用于定制工作流的可视外观的示例性装置、用于确认工作流的示例性装置、用于编译工作流的示例性装置、以及用于将类型与工作流中的每一活动相关联的示例性装置。
活动执行框架
由于有进度表和作用域的例外,因此引擎将活动视为抽象的实体,并仅协调活动的执行而不知道任何特定活动的具体数据或语义。在一个实施例中,四个实体在活动的执行期间交互:活动本身、正在执行的活动的父活动、包含正在执行的活动的作用域、以及配合引擎。每一实体具有不同的功能。
如果活动的执行方法返回而没有向其活动协调器发信号通知完成,则该活动被认为是在逻辑等待状态中。这一活动可由配合引擎取消,或继续(例如,一旦它所等待的项或事件变得可用或发生,且由引擎向该活动通知这一情况)。
某些从未进入逻辑等待状态的活动可能从不被取消。示例包括发送活动和代码活动,因为它们不需要对外部事件或预定的需求就可执行。一旦交出了线程(即,一旦其执行方法由配合引擎调用),则这些活动将做工作直到完成。从不给配合引擎取消它们的机会,因为它们不返回线程直到它们发信号通知完成。
配合引擎运行时环境使用规则来触发在其上执行配合引擎活动的事件。配合引擎设计器向用户提供了在运行时关联要评估的规则来触发事件的能力。配合引擎设计器通过提供可扩展性体系结构使用户能够使用不同类型的规则技术。该设计器对于所使用的规则技术的类型是不可知的。
在一个实施例中,设计器支持布尔表达式处理程序,作为将规则与活动相关联的一种方式。这意味着在用户代码文件中,用户编写返回真或假值的方法,基于该方法触发规则。当前有多种可用于评估规则的技术,包括信息代理(Info Agent)和商业规则引擎(BRE)。为实现这一目标,设计器包括使规则技术开发者能够在设计器中主宿自定义用户界面的可扩展性体系结构。该设计器提供了一种自定义用户界面编写者以代码语句集合的形式序列化规则的方法。该设计器在用户代码文件中发放布尔处理程序,并向其插入代码语句集合。配合引擎包括可由规则编写者使用的默认用户界面。规则技术提供者通过创建自定义规则声明、编写与自定义规则声明相关联的用户界面类型编辑器、创建自定义用户界面来主宿规则用户界面、以及在保存时生成代码语句来向配合引擎设计器添加规则。
在一个示例中,用户选择要向其附加规则的活动设计器、在属性浏览器中定位规则属性并在下拉框中选择“RuleExpressionHandler(规则表达式处理程序)”(它使得“Statements(语句)”属性出现在用户界面的Rule(规则)属性下方)、在“Statements”属性中指定用户代码方法名、调用用户界面类型编辑器来调用主宿规则专用用户界面的对话框、以及在对话框中通过创建新的谓词行并将它们组合在一起来定义规则。用户界面在用户代码文件中发放方法。方法名将与由用户在属性浏览器中指定的名称相同。等效于创建规则的代码语句将被插入到该规则的用户代码方法中。
执行期间的消息通信
在运行工作流中,发送到进度表的消息是预期供特定进度表实例使用的。例如,购买定单#123的发票必须被发送回发起(例如,发送出)该购买定单的同一进度表实例。为将入站消息与适当的进度表实例相匹配,消息和进度表实例共享一相关集。该相关集可以是单值相关集,这意味着消息中的标识符字段与由进度表实例持有的相同类型的标识符进行匹配。多属性相关集也是可能的,且类似于数据库表中的多列主要关键字。
进度表实例持有的相关集的值是在进度表实例发送出消息时初始化的(例如,可从出栈定单的标识符字段中取该值),或当进度表实例接收消息时初始化的。该相关集值然后是该进度表实例状态的一部分。当随后的入站消息到达时,进度表实例状态中保持的相关集值与由预期类型的入站消息所持有的标识符字段进行匹配。当找到匹配,则满足该相关集,且该消息被传递到进度表实例。
尽管相关集的实现是由配合引擎和宿主环境所决定的,但是在一个实施例中,用户声明该相关集以使进度表实例能够正确工作。在另一实施例中,某些活动(例如,SendRequest(发送请求)/ReceiveResponse(接收响应)活动以及ReceiveRequest(接收请求)/SendReponse(发送响应)活动)与用户无关地设置相关集。由发送和接收活动执行各种各样的确认检查,以确保相关集是正确初始化和遵循的。
执行工作流的动态编辑
配合引擎提供了用于创作(以及随后可视化和执行)各种类型的工作流的框架。示例包括事件-条件-动作(ECA)风格的工作流或结构化工作流或规则驱动工作流。此外,不论是如何对工作流建模的,工作流都允许用户在设计时或甚至在工作流过程正在运行时以同一方式创作或编辑工作流,而无需重新编译该工作流过程。该框架允许用户以高保真度在运行时和设计时表示之间进行往返。特别(adhoc)改变是在运行时对过程模型做出的改变。用户可向运行的实例要求其进度表模型,并向该模型做出改变。例如,用户可按批添加、移除或替换活动,然后提交或回退批处理的改变。在一个实施例中,模型是在更新之后确认的。在本发明的许多工作流情形中,“设计时创作”和“运行时执行”之间的分隔存在模糊或甚至是消除。
进度表实例有效地与其它实例共享为那些实例的进度表类型所定义的活动类型(元数据)树。但是一旦开始执行,任何进度表实例可通过添加新活动或操纵声明性规则在进行中改变。采取这一修改的进度表实例并“保存为”新进度表类型,或更一般地,仅从实例中恢复序列化的表示是可能的。即,运行的进度表实例可被序列化,然后将其带入任何设计器(例如,创作环境)或运行时可视化工具。
此外,对于高级开发者而言,将进度表完全作为软件代码来创作是可能的。为直接创作进度表类型,开发者只需在该进度表的代码分离类的软件代码中包括称为InitializeScheduleModel(初始化进度表模型)的方法,然后用[ScheduleCreator](进度表创建器)元属性来标记该方法。在一个实施例中,该静态方法不采用任何参数,并返回一Schedule(进度表)对象。没有伴随的序列化文件,尽管可从所创建的Schedule对象中恢复该进度表的序列化表示。尽管这意味着可使用单个软件代码文件来开发进度表,然而可能不在该文件上执行确认检查。配合引擎编译确保作为进度表类型的基础的活动树的结构和语义有效性。在另一实施例中,编译和确认内部地运行,以产生所执行的实际类型,而不要求任何代码输入。进度表类型编译变为一种非常容易的过程,因为没有从编译时对象模型到运行时对象模型的转换。本质上,编译只需将进度表的对象模型表示与代码分离相组合以产生新类型。在一个实施例中,如果所编译的代码分离与对象模型中的活动所需求的相匹配,对特定的进度表可能完全没有任何基本需求来提供任何代码分离,或者代码分离可能已经以编译的形式(程序集)存在。
当编译序列化进度表时,指向有效地担当该进度表的代码分离的现有已编译类型是可能的。创建该已编译类型的派生类型,且该新类型担当代码分离以确保创建了唯一的类型来表示该新进度表。
序列化体系结构
序列化基础结构提供了一种模块化的、格式中立且容易扩展的机制来序列化配合引擎活动树。具体地,调用者(例如,应用程序或用户)向序列化管理器请求对象(或活动)A的序列化器。对象A的类型的元数据元属性将对象A绑定到所请求类型的序列化器。调用者然后要求序列化器序列化对象A。对象A的序列化器然后序列化对象A。对于在序列化时遇到的每一对象,序列化器向序列化管理器请求另外的序列化器。序列化的结果被返回给调用者。
配合引擎组件模型中的每一活动可参与序列化。在一个实施例中,序列化器组件不是活动类本身的一部分。相反,该组件通过在与该活动相关联的类中注释序列化器元属性来指定。序列化器元属性指向用于序列化该活动类型的对象的类。在另一实施例中,活动类型的提供者组件覆盖了由该活动提供的默认序列化器。
设计器序列化基于元数据、序列化器和序列化管理器。元数据元属性用于将类型与序列化器相关。“程序引导”元属性可用于安装为没有序列化器的类型提供序列化器的对象。序列化器是知道如何序列化特定类型或类型作用域的对象。对每一数据格式存在一基类。例如,可以有知道如何将对象转换成XML的XmlSerializer(XML序列化器)基类。本发明是独立于任何特定序列化格式的通用体系结构。序列化管理器是对用于序列化对象图的所有各种序列化器提供信息存储的对象。例如,五十个推想的图可具有五十个不同的序列化器,它们都生成其自己的输出。序列化管理器可由这些序列化器使用以在必要时彼此通信。
在一个实施例中,与使用类属对象元数据的序列化器耦合的序列化提供者的使用提供了一种回叫机制,其中,给予对象向给定类型提供序列化器的机会。可通过诸如AddSerializationProvider(添加序列化提供者)等方法来向序列化管理器给予序列化提供者。序列化提供者可通过向序列化器添加诸如DefaultSerializationProviderAttribute(默认序列化提供者属性)等元属性而被自动添加到序列化管理器。
在一个实施例中,格式由以下规则来规定:对象被序列化为xml元素、对象的属性被归类为简单属性(例如,序列化为xml元属性)或复杂属性(序列化为子元素)、以及对象的子对象被序列化为子元素。子对象的定义可在各个对象之间不同。以下示例是while活动的序列化,它具有Send活动作为其子对象之一。
<While ID=″whilel″>
<ConditionRule>
<CodeExpressionRuleDeclaration>
<Expression Name=″whileCondition″/>
</CodeExpressionRuleDeclaration>
</ConditionRule>
<Send Has TypedChannel=″True″ID=″sendl″>
<Message Name=″msgl″Type=″System.UInt32″/>
<OnBeforeSend Name=″onBeforeSendl″/>
<TypedChannel Type=″System.Collections.IList″
Operation=″AddIndex″Name=″Foo″/>
</Send>
</While>
在其中用于序列化的语言是XOML的实施例中,当编译进度表时,每一XOML元素被序列化成其各自的对象。对象包括简单和复杂类型两者。接下来描述每一活动的XOML表示之问的映射及其到创作对象模型的映射。XOML的序列化在原语(Primitive)和合成(Composite)活动之间有所不同。
原语活动的简单类型被序列化为该活动类型上的元属性。原语活动的复杂类型被序列化为子元素。作为一个示例,以下是Send活动的XOML表示。
<Send ID=″sendl″HasTypedChannel=″False″>
<Message Name=″messagel″Type=″System.String″/>
<UntypedChannel Name=″cl″/>
</Send>
以与原语类型序列化类似的方式,合成活动的简单类型被序列化为该活动类型上的元属性。然而,按照定义,合成活动封装了嵌套的活动。每一嵌套的活动被序列化为另一子元素。作为一个示例,以下是While活动的XOML表示。
<While ID=″whilel″>
<ConditionRule>
<CodeExpressionRule>
<Expression Name=″test″/>
</CodeExpressionRule>
</ConditionRule>
</While>
过程/工作流视图和序列化的表示之间存在强关系。图8示出了可视工作流、该工作流的序列化(例如,XOML)表示以及该工作流的分离代码之间的进度表定义和关系。当以任一表示创作时,其它表示将招致改变。由此,当开发者在XOML和过程/工作流视图之间切换时,修改活动的XOML(或在合成活动的情况下修改其构成部分)直接在过程/工作流视图中得到反映。反过来也是适用的。修改过程/工作流视图中的活动导致XOML内的适当修改。作为一个示例,过程/工作流中的活动的删除导致同一活动的XOML中XML元素的移除。在过程/工作流视图和分离的代码之间也发生往返。
在创建XOML代码的过程中,如果XOML定义不符合预定义的接口要求,则在违反的XML元素下加下划线,或用其它方式可视地向开发者标识。如果开发者切换到过程视图,则将向他们警告在XOML内存在错误,且设计器提供一链接,开发者可点击该链接并且会被导航到违反的元素。该同一错误出现在任务面板中,并且在双击该错误之后,开发者将会被导航到XOML中违反的元素。
从XOML文件创建活动树(反序列化)
在一个实施例中,CreateEditorInstance()函数(创建编辑器实例)创建DesignSurface(设计表面)对象,然后对DesignSurface对象调用BeginLoad()函数(开始加载),向其传递实际的加载器对象,最终以对DesignerLoader()函数(设计器加载器)的BeginLoad()调用而结束。PerformLoad()函数(执行加载)读取文本缓冲区对象,并将其反序列化到配合引擎组件模型分层结构。本发明走查该分层结构,并将活动插入到设计表面以加载视件工作室(visual sutdio)中的组件。
本发明也监听对XOML文件的改变以跟踪分层结构和项标识改变,来更新视件工作室高速缓存中的值。次要文档数据列表包括对用户不可见的次要文档的列表,配合引擎设计器在这些次要文档上工作。例如,用户尚未打开分离代码文件,但当用户在配合引擎设计器中做出改变时,对该分离代码文件做出改变是可能的。由于该文件对用户是不可见的,因此该文件作为次要文档来维护。只要保存XOML文件,就自动保存次要文档。如果这些文件之一的名字改变,或者文件被删除,则本发明相应地更新对应的次要文档对象。
对象树的示例性反序列化准则如下。xml元素首先作为父对象的属性来处理。如果父对象没有具有该元素标签名的属性,则该元素作为父对象的子对象来处理。xml元属性作为父对象上的简单属性来处理。
在适用上述序列化代码的一个示例性反序列化中,<While>元素作为适用xml名字空间信息创建的对象来处理。<ConditionRule>元素作为While活动的属性来处理。<CodeExpressionRuleDeclaration>元素作为其值将被应用于ConditionRule属性的对象来处理。<Send>元素首先作为While活动的属性来尝试,但“While”活动没有具有名字为“Send”的属性,因此<Send>元素作为对象来处理,并作为子活动添加到while活动。<Message>元素作为Send活动的属性来处理。由于Send上的Message属性是只读的,因此Message元素的内容被认为是Message对象的内容。类似的规则也适用于<OnBeforeSend>和<TypedChannel>元素的反序列化。
在以下条件下,XOML反序列化将会严重失败:XOML代码不是良好形成的、XomlDocument不是XOML代码中的第一个元素、以及XOML代码中的第一个活动不能被反序列化。将向开发者呈现出错消息,当从XOML视图切换到过程/工作流视图时,通过该消息他们可被导航到违反的XML元素。
主宿配合引擎设计器
设计器框架可被主宿在任何应用程序中。这对于第三方应用程序要在其各自的环境中呈现工作流而言是非常有用的特征。它也允许第三方通过重新主宿和定址设计器表面来开发关于配合引擎设计器的工具。本发明的框架期望主宿容器应用程序能够提供诸如编辑器和/或文本缓冲区等一组服务。
重新主宿设计器的一个步骤是创建加载器和设计表面。加载器负责加载XOML文件,并构造维护活动的设计器宿主基础结构。设计表面维护其中的设计器宿主基础结构,并向宿主提供服务且与设计表面交互。设计表面担当服务容器以及服务提供者。在一个示例中,执行以下代码来加载XOML文档并构造维护其中的活动的设计器宿主。
this.loader.XomlFile=filePath;
if(this.surface.IsLoaded==false)
this.surface.BeginLoad(this.loader);
以下服务启用了设计器中的不同函数。ISelectionService函数(选择服务)维护所选中的对象。IToolboxService函数(工具箱服务)管理与工具箱的交互。IMenuCommandService函数(菜单命令服务)管理与菜单的交互。ITypeProvider函数(类型提供者)启用类型系统。另外,可以有由设计器主宿环境提供的其它服务,以启用高级的设计器特征。
类型流是本发明的组件模型框架中的一个组件。当设计器主宿在项目系统内部时,在每一项目的基础上创建TypeProvider(类型提供者)对象。项目中的程序集引用被压入类型提供者。此外,对项目中的用户代码文件进行语法分析,并创建单个代码编译且将其压入类型提供者。同样,本发明监听项目系统中将导致类型系统中的类型改变的事件,并响应于改变对类型提供者做出适当的调用来重新加载类型。
撤消/恢复
在创建且正确地构造了进度表之后,开发者可能希望回退一系列已执行的操作。本发明的撤消和恢复功能提供了可视的反馈,它示出了哪一活动被直接影响。例如,当撤消活动上的属性时,被影响的活动变为选中。当撤消多个对象的删除时,当被恢复到进度表时,所涉及的所有对象变为选中。撤消/恢复是在其它领域的许多应用程序中使用的常见特征,且其意义是被普遍理解的。在配合引擎设计器中,撤消/恢复项在保存时不被清除。此外,撤消/恢复可在过程/工作流视图中、XOML视图中、当开发者在视图之间切换时、以及在分离代码中执行。
对过程/工作流视图中的以下动作提供了撤消/恢复:活动拖放(例如,将活动从工具箱拖到设计表面、将活动从进度表的一部分移到另一部分、以及将活动从一个设计器移到另一设计器)、活动的配置(例如,指定活动的属性)、以及剪切/复制/粘贴/删除。
在一个实施例中,序列化的视图(例如,XOML)视图是提供文本编辑器的标准撤消/恢复操作的XML编辑器。本发明的设计器向开发者提供了反馈,指示过程/工作流视图中做出改变然后在序列化视图中撤消将导致序列化代码的丢失。当开发者在过程/工作流视图中构造进度表的一部分时,切换到序列化视图然后决定执行撤消/恢复操作,将出现警告。
示例性操作环境
图9以计算机130的形式示出了通用计算设备的一个示例。在本发明的一个实施例中,诸如计算机130等计算机适用于此处所示和所描述的其它附图。计算机130具有一个或多个处理器或处理单元132以及系统存储器134。在所示的实施例中,系统总线136将包括系统存储器134的各种系统组件耦合至处理器132。总线136表示若干类型总线结构的任一种的一个或多个,包括存储器总线或存储器控制器、外围总线、加速图形端口、以及使用各种总线体系结构的任一种的处理器或局部总线。作为示例而非局限,这类体系结构包括工业标准体系结构(ISA)总线、微通道体系结构(MCA)总线、增强ISA(EISA)总线、视频电子技术标准协会(VESA)局部总线以及外围部件互连(PCI)总线,也称为Mezzanine总线。
计算机130通常具有至少某种形式的计算机可读介质。计算机可读介质可以是可由计算机130访问的任何可用介质,可包括易失性和非易失性介质、可移动和不可移动介质。作为示例而非局限,计算机可读介质包括计算机存储介质和通信介质。计算机存储介质包括以用于储存诸如计算机可读指令、数据结构、程序模块或其它数据等信息的任一方法或技术实现的易失性和非易失性,可移动和不可移动介质。例如,计算机存储介质包括RAM、ROM、EEPROM、闪存或其它存储器技术、CD-ROM、数字多功能盘(DVD)或其它光盘存储、磁盒、磁带、磁盘存储或其它磁存储设备、或可以用来储存所期望的信息并可由计算机130访问的任一其它介质。通信介质通常具体化为诸如载波或其它传输机制的已调制数据信号中的计算机可读指令、数据结构、程序模块或其它数据,并包括任一信息传送介质。本领域的技术人员熟悉已调制数据信号,它以对信号中的信息进行编码的方式设置或改变其一个或多个特征。有线介质,如有线网络或直接连线连接,以及无线介质,如声学、RF、红外和其它无线介质,都是通信介质的示例。上述任一的组合也应当包括在计算机可读介质的作用域之内。
系统存储器134包括易失性和/或非易失性存储器形式的计算机存储介质。在所示的实施例中,系统存储器134包括只读存储器(ROM)138和随机存取存储器(RAM)140。基本输入/输出系统142(BIOS)包括如在启动时帮助在计算机130内的元件之间传输信息的基本例程,通常储存在ROM 138中。RAM 140通常包含处理单元132立即可访问或者当前正在操作的数据和/或程序模块。作为示例而非局限,图9示出了操作系统144、应用程序146、其它程序模块148和程序数据150。
计算机130也可包括其它可移动/不可移动、易失性/非易失性计算机存储介质。例如,图9示出了对不可移动、非易失性磁介质进行读写的硬盘驱动器154。图9也示出了对可移动、非易失性磁盘158进行读写的磁盘驱动器156以及对可移动、非易失性光盘162,如CD ROM或其它光介质进行读写的光盘驱动器160。可以在示例性操作环境中使用的其它可移动/不可移动、易失性/非易失性计算机存储介质包括但不限于,磁带盒、闪存卡、数字多功能盘、数字视频带、固态RAM、固态ROM等等。硬盘驱动器154、磁盘驱动器156和光盘驱动器160通常通过非易失性存储器接口,如接口160连接到系统总线136。
上文讨论并在图9示出的驱动器及其关联的计算机存储介质为计算机130提供了计算机可读指令、数据结构、程序模块和其它数据的存储。例如,在图9中,示出硬盘驱动器154储存操作系统170、应用程序172、其它程序模块174和程序数据176。注意,这些组件可以与操作系统144、应用程序146、其它程序模块148和程序数据150相同,也可以与它们不同。这里对操作系统170、应用程序172、其它程序模块174和程序数据176给予不同的标号来说明至少它们是不同的副本。
用户可以通过输入设备或用户界面选择设备,如键盘180和定位设备182(例如,鼠标、跟踪球或触摸垫)向计算机130输入命令和信息。其它输入设备(未示出)可包括麦克风、操纵杆、游戏垫、圆盘式卫星天线、扫描仪等等。这些和其它输入设备通常通过耦合至系统总线136的用户输入接口184连接至处理单元132,但是也可以通过其它接口和总线结构连接,如并行端口、游戏端口或通用串行总线(USB)。监视器188或其它类型的显示设备也通过接口,如视频接口190连接至系统总线136。除监视器188之外,计算机通常包括其它外围输出设备(未示出),如打印机和扬声器,它们可通过输出外围接口(未示出)连接。
计算机130可以使用到一个或多个远程计算机,如远程计算机194的逻辑连接在网络化环境中操作。远程计算机194可以是个人计算机、服务器、路由器、网络PC、对等设备或其它普通网络节点,并通常包括许多或所有相对于计算机130所描述的元件。图9描述的逻辑连接包括局域网(LAN)196和广域网(WAN)198,但也可包括其它网络。LAN 136和/或WAN 138可以是有线网络、无线网络、其组合等等。这类网络环境常见于办公室、企业作用域计算机网络、内联网以及全球计算机网络(例如,因特网)。
当在局域网网络环境中使用时,计算机130通过网络接口或适配器186连接至LAN 196。当在广域网网络环境中使用时,计算机130通常包括调制解调器178或用于通过WAN 198,如因特网建立通信的其它装置。调制解调器178可以是内置或外置的,它通过用户输入接口184或其它适当的机制连接至系统总线136。在网络化环境中,相对于计算机130所描述的程序模块或其部分可储存在远程存储器存储设备(未示出)中。作为示例而非局限,图9示出远程应用程序192驻留在存储器设备上。示出的网络连接是示例性的,也可以使用在计算机之间建立通信链路的其它装置。
一般而言,计算机130的数据处理器通过在不同的时刻储存在计算机的各种计算机可读存储介质中的指令来编程。例如,程序和操作系统通常分布在软盘或CD-ROM上。从那里,它们被安装或加载到计算机的次级存储器中。在执行时,它们被至少部分地加载到计算机的初级电子存储器中。此处描述的本发明包括这些和其它各种类型的计算机可读存储介质,这些介质包含用于实现以下结合微处理器或其它数据处理器描述的步骤的指令。当依照此处描述的方法和技术编程时,本发明也包括计算机本身。
为说明起见,诸如操作系统等程序和其它可执行程序组件在此被示出为离散的框。然而,可以认识到,这些程序和组件在不同的时刻驻留在计算机的不同存储组件中,且由计算机的数据处理器执行。
尽管结合包括计算机130的示例性计算系统环境来描述,然而本发明也可用众多其它通用或专用计算系统环境或配置来操作。该计算系统环境并非对本发明的使用作用域或功能提出任何局限。此外,该计算环境不应当被解释为对示例性操作环境中所示的组件的任一个或其组合具有任何依赖性或要求。可适用于本发明的公知的计算系统、环境和/或配置的示例可包括,但不限于,个人计算机、服务器计算机、手持式或膝上设备、多处理器系统、基于微处理器的系统、机顶盒、可编程消费者电子产品、移动电话、网络PC、小型机、大型计算机、包括上述系统或设备的任一个的分布式计算环境等等。
本发明可以在诸如由一个或多个计算机或其它设备执行的程序模块等计算机可执行指令的一般上下文环境中描述。一般而言,程序模块包括但不限于,例程、程序、对象、组件、数据结构等等,它们执行特定的任务或实现特定的抽象数据类型。本发明也可以在分布式计算环境中实践,其中,任务由通过通信网络连接的远程处理设备来执行。在分布式计算环境中,程序模块可以位于包括存储器存储设备的本地和远程计算机存储介质中。
软件体系结构上下文中的接口包括软件模块、组件、代码部分或其它计算机可执行指令序列。例如,接口包括访问第二模块的第一模块,以代表该第一模块执行任务。在一个示例中,第一和第二模块包括诸如由操作系统提供的应用程序编程接口(API)、组件对象模型(COM)接口(例如,用于对等应用程序通信)、以及可扩展标记语言元数据互换格式(XMI)的接口(例如,用于web服务之间的通信)。
接口可以是紧耦合的同步实现,诸如Java 2平台企业版(J2EE)中、COM或分布式COM(DCOM)示例。作为替换或除此之外,接口可以是松耦合的异步实现,诸如web服务中(例如,使用简单对象访问协议)。一般而言,接口包括以下特征的任一组合:紧耦合、松耦合、同步和异步。此外,接口可以符合标准协议、专有协议或标准和专有协议的任一组合。
此处描述的接口可以都是单个接口的一部分,或可以被实现为单独的接口或其中的任何组合。接口可以本地或远程地执行以提供功能。此外,接口可包括比所示或所描述的更多或更少的功能。
此处所示和描述的方法的执行或实现的顺序不是关键的,除非另外指定。即,方法的各元素可以用任何顺序执行,除非另外指定,并且方法可包括比此处所解释的更多或更少的元素。例如,在本发明的范围内可以构想,可以另一元素之前、与其同时或在其之后执行特定元素。
当介绍本发明或其实施例的元素时,冠词“一”、“一个”、“该”和“所述”意指存在一个或多个元素。术语“包含”、“包括”或“具有”旨在包括性的,且意味着除所列出的元素之外还可以有其它元素。
鉴于以上内容,可以看到,可以实现本发明的若干目标并且可以达到其它有利的结果。
由于可以在以上构造、产品和方法中做出各种改变而不脱离本发明的范围,因此预期以上描述中包含且在附图中示出的所有内容都应当在说明性而非限制性的意义上解释。
附录A
示例性活动及其示例性实现
示例性活动包括以下活动:Send(发送)、SendRequest(发送请求)、SendResponse(发送响应)、Receive(接收)、ReceiveRequest(接收请求)、ReceiveResponse(接收响应)、Code(代码)、Delay(延迟)、Fault(错误)、Suspend(挂起)、Terminate(终止)、InvokeSchedule(调用进度表)、InvokeSchedules(调用多个进度表)、InvokeWebService(调用web服务)、DotNetEventSource(.NET事件源)、DotNetEventSink(.NET事件宿)、Sequence(顺序)、Parallel(并行)、While、ConditionalBranch(条件分支)、Conditional(条件)、Constrained(约束)、ConstrainedActivityGroup(约束活动组)(CAG)、EventDriven(事件驱动)、Listen(监听)、EventHandlers(事件处理程序)、ExceptionHandler(异常处理程序)、ExceptionHandlers(多个异常处理程序)、Compensate(补偿)、CompensationHandler(补偿处理程序)、Scope(作用域)以及Schedule(进度表)。
每一示例性活动具有与其相关联的元数据。元数据由与该活动相关联的序列化器传输到工作流的声明性表示。例如,元数据可包括可任选的代码分离方法以及可任选的相关集集合。
Send活动
配合引擎提供用于发送消息的三种活动(例如,Send、SendRequest以及SendResponse),其每一个着重于一个不同的使用情况。另外,由于三个活动共享某一元数据,因此定义了一抽象基类并将其用作所有三个活动的超类。
Receive活动
配合引擎提供了用于接收消息的三种活动(例如,Receive、ReceiveRequest以及ReceiveResponse),其每一个着重于一个不同的使用情况。另外,由于三个活动共享某一元数据,因此定义了一抽象基类并将其用作所有三个活动的超类。
Code
Code活动执行元数据中指示的代码分离方法。
Delay
Delay活动执行其强制的代码分离方法来生成DateTime(日期时间)值。它内部地将其实例上的TimeoutValue(超时值)属性设为该值。如果DateTime是过去的,则Delay立即完成。否则,它设置一定时器预定,使得当定时器激发时将通知Delay。当定时器激发时,通知Delay并且它完成。
Fault
Fault活动执行其强制的代码分离方法来生成Exception(异常)对象。它然后抛出该异常。
Suspend
Suspend活动挂起当前的进度表实例。
Terminate
Terminate活动终止当前的进度表实例。
InvokeSchedule
InvokeSchedule活动调用进度表。
InvokeWebService
通过代理类调用web服务,转递和接收所指定的参数。
DotNetEventSink
阻断由先前调用的进度表实例引发的指定事件的等待通知。
DotNetEventSource
引发所指定的事件,并立即完成执行。
Sequence
Sequence活动以有序的方式协调一组子活动的执行,每次一个。
Parallel
Parallel活动并发地执行一组子活动。
While
迭代地执行子活动。
ConditionBranch
对每一Sequence语义执行子活动。
Conditional
Conditional活动包含一组有序的ConditionalBranch活动。
Constrained
当CAG告知要执行Constrained活动时,它仅仅执行它所包装的活动。
CAG(ConstrainedActivityGroup)
当CAG执行时,它基于其启用和禁用的约束的评估来执行(并重新执行)子活动。
Task
对由一个或多个主体执行的工作的外部单元建模。
EventDriven
包装其执行由“事件”活动触发的活动。
Listen
条件地执行EventDriven活动的n个子活动之一。
EventHandlers
EventHandlers活动简单地持有一组EventDriven活动,以供相关联的Scope使用。
ExceptionHandler
用表示作用域的捕捉块(catch block)的元数据包装活动。
ExceptionHandlers
包装一组有序的ExceptionHandler活动。
Compensate
补偿已完成的子作用域。
CompensationHandler
包装被定义为用于作用域的补偿处理程序的子活动。
Scope
作用域是:事务边界;异常处理边界;补偿边界;事件处理边界;以及消息、变量、相关集以及通道声明(即,共享数据状态)的边界、Scope内活动的执行是顺序的,并且由此,当构造作用域时,所包含的活动是明确地排序的,如同在Sequence中一样。
Schedule
Schedule是配合引擎将执行的唯一顶层活动。
CompositeActivities
允许控制流的补偿活动类型是:Sequence、Parallel、Constrained、ActivityGroup、Conditional、While、Listen。另外,Scope和Schedule是担当容器的补偿活动类型,该容器具有其中的活动的隐含排序。
Claims (20)
1.一种将出错和异常处理应用于工作流中一个或多个选中活动的计算机实现的方法,所述计算机实现的方法包括:
选择一预定义的行为组件;
选择工作流中一个或多个的活动;以及
将所选择的行为组件与所选择的活动相关,以使所选择的行为组件能够响应于所选择的活动而运作。
2.如权利要求1所述的计算机实现的方法,其特征在于,所述行为组件包括一个或多个规则,并且其中,所选择的行为组件将所述规则应用于所选择的活动。
3.如权利要求1所述的计算机实现的方法,其特征在于,还包括与所选择的行为组件协调地执行所选择的活动。
4.如权利要求1所述的计算机实现的方法,其特征在于,执行所选择的活动包括:
创建与所选择的行为组件相关联的上下文;
在所创建的上下文中执行所选择的活动。
5.如权利要求1所述的计算机实现的方法,其特征在于,还包括:
从用户接收用户定义的活动,所述用户定义的活动具有与其相关联的一个或多个语义;
评估所述语义学,以找出与预定义接口要求的一致性;
根据所述评估,在所创建的上下文中执行所接收的用户定义活动。
6.如权利要求1所述的计算机实现的方法,其特征在于,所述行为组件包括描述所述行为组件的功能的元数据。
7.如权利要求1所述的计算机实现的方法,其特征在于,还包括从用户处接收对所述元数据的修改。
8.如权利要求1所述的计算机实现的方法,其特征在于,一个或多个计算机可读介质具有用于执行如权利要求1所述的计算机实现的方法的计算机可执行指令。
9.如权利要求1所述的计算机实现的方法,其特征在于,还包括定义所述一个或多个活动。
10.如权利要求1所述的计算机实现的方法,其特征在于,还包括定义所述行为组件。
11.一个或多个具有计算机可执行模块的计算机可读介质,所述模块用于将出错和异常处理应用于工作流中的一个或多个活动,所述模块包括:
设计器模块,用于选择一预定义的行为组件以及用于选择工作流中的一个或多个活动。
上下文模块,用于将由所述设计器模块选择的行为组件和活动相关,以使所选择的行为组件能够响应于所选择的活动而运作;以及
运行时引擎模块,用于根据由所述上下文模块相关的行为组件,执行由所述设计器模块选择的活动。
12.如权利要求11所述的计算机可读介质,其特征在于,还包括选项板模块,用于定义所述行为组件。
13.如权利要求11所述的计算机可读介质,其特征在于,所述上下文模块还创建与所定义的行为组件相关联的上下文。
14.如权利要求11所述的计算机可读介质,其特征在于,所述设计器模块包括用户界面。
15.一种用于将出错和异常处理应用于工作流中的一个或多个活动的系统,所述系统包括:
存储多个活动的存储器区域,每个活动具有定义的接口,所述存储器区域还存储多个行为组件,每个行为组件符合所述定义的接口,每个行为组件涉及至少两个活动;以及
处理器,它被配置成执行计算机可执行指令,用于:
从用户接收对存储在所述存储器区域中的行为组件之一的选择;
从用户接收对存储在所述存储器区域中的至少两个活动的选择;
创建与所选择的行为组件相关联的上下文;以及
在所创建的上下文中执行所选择的活动。
16.如权利要求15所述的系统,其特征在于,存储在所述存储器区域中的行为组件涉及下列的一个或多个:出错处理、异常处理以及消息通信。
17.如权利要求15所述的系统,其特征在于,存储在所述存储器区域中的每个行为组件包括作用域组件和过程组件。
18.如权利要求17所述的系统,其特征在于,所述作用域组件涉及下列的一个或多个:过程分析、状态管理、事务、同步以及异常出错处理。
19.如权利要求17所述的系统,其特征在于,所述过程组件涉及下列的一个或多个:事务处理、同步以及异常出错处理。
20.如权利要求15所述的系统,其特征在于,所述存储器区域还包括用于每个行为组件的数据结构,所述数据结构包括下列的一个或多个:属性、方法、事件、设计器、序列化器以及运行时组件。
Applications Claiming Priority (3)
Application Number | Priority Date | Filing Date | Title |
---|---|---|---|
US61553704P | 2004-10-01 | 2004-10-01 | |
US60/615,537 | 2004-10-01 | ||
US11/047,301 | 2005-01-31 |
Publications (1)
Publication Number | Publication Date |
---|---|
CN1808375A true CN1808375A (zh) | 2006-07-26 |
Family
ID=36840292
Family Applications (1)
Application Number | Title | Priority Date | Filing Date |
---|---|---|---|
CN 200510099841 Pending CN1808375A (zh) | 2004-10-01 | 2005-09-01 | 对工作流领域中横切行为问题建模的框架 |
Country Status (1)
Country | Link |
---|---|
CN (1) | CN1808375A (zh) |
Cited By (2)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103336705A (zh) * | 2011-09-09 | 2013-10-02 | 微软公司 | 脚本处理和工作流系统间的自动转码和语义自适应 |
CN110069034A (zh) * | 2011-10-24 | 2019-07-30 | 费希尔控制国际公司 | 具有预定义的错误状态的现场控制设备及相关方法 |
-
2005
- 2005-09-01 CN CN 200510099841 patent/CN1808375A/zh active Pending
Cited By (3)
Publication number | Priority date | Publication date | Assignee | Title |
---|---|---|---|---|
CN103336705A (zh) * | 2011-09-09 | 2013-10-02 | 微软公司 | 脚本处理和工作流系统间的自动转码和语义自适应 |
CN103336705B (zh) * | 2011-09-09 | 2016-12-21 | 微软技术许可有限责任公司 | 脚本处理和工作流系统间的自动转码和语义自适应 |
CN110069034A (zh) * | 2011-10-24 | 2019-07-30 | 费希尔控制国际公司 | 具有预定义的错误状态的现场控制设备及相关方法 |
Similar Documents
Publication | Publication Date | Title |
---|---|---|
CN1825343A (zh) | 创作和执行基于流程且基于约束的工作流的统一模型 | |
CN1755721A (zh) | 组件化和可扩展的工作流模型 | |
CN1252592C (zh) | 通信服务供应方法和设备 | |
CN1766835A (zh) | 用于在设计和运行时间无缝制作和编辑工作流的框架 | |
CN100351822C (zh) | 用简化视图定义、处理和表示用户界面组件的方法和工具 | |
US8170901B2 (en) | Extensible framework for designing workflows | |
EP1643435B1 (en) | An extensible framework for designing workflows | |
JP5710852B2 (ja) | 設計時および実行時にワークフローを継ぎ目なくオーサリングし編集するためのフレームワーク | |
KR20060087996A (ko) | 작업 흐름 도메인에서 횡단적인 거동 관심사를 모델링하는컴퓨터 구현 방법 | |
CN1811702A (zh) | 开发门户应用和自动部署门户应用的系统和方法 | |
CN1419675A (zh) | 用于自上而下的企业过程定义和执行的方法和系统 | |
JP2006107474A (ja) | 拡張可能ワークフローモデルの宣言的表現 | |
CN1607501A (zh) | 标记构架 | |
CN101052956A (zh) | 在标记语言环境中使用可撤消命令来编辑文档的文档处理和管理方法 | |
CN1591405A (zh) | 版本兼容的数据处理系统 | |
CN1647042A (zh) | 定制软件抽象的方法 | |
CN1627257A (zh) | 用于创建模块化web应用的框架 | |
CN1534476A (zh) | 矢量图形的标记语言和对象模型 | |
JP2006107480A (ja) | フローベースおよび制約ベースのワークフローをオーサリングし、実行するための統一モデル | |
MX2008011908A (es) | Estructura de trabajo para modelar continuaciones en flujos de trabajo. | |
CN1834908A (zh) | 用于将开发模式应用于基于组件的应用程序的系统和方法 | |
CN1249045A (zh) | 实现层次状态图的装置和对其有用的方法及设备 | |
CN1585948A (zh) | 用于系统整合的应用程序视窗部件 | |
CN1633638A (zh) | 在外貌特征模式中带有总功能特性的连接实体 | |
JP5174782B2 (ja) | 情報処理装置、情報処理装置の制御方法、プログラムおよび記録媒体 |
Legal Events
Date | Code | Title | Description |
---|---|---|---|
C06 | Publication | ||
PB01 | Publication | ||
C10 | Entry into substantive examination | ||
SE01 | Entry into force of request for substantive examination | ||
C12 | Rejection of a patent application after its publication | ||
RJ01 | Rejection of invention patent application after publication |
Open date: 20060726 |