IBM®
跳转到主要内容
    中国 [选择]    使用条款
 
 
Select a scope:Search for:    
    首页    产品    服务与解决方案     支持与下载    个性化服务    
跳转到主要内容

developerWorks 中国  >  WebSphere  >

一种新的MQ WorkFlow流程建模方法在具体案例中的实现

developerWorks
文档选项

未显示需要 JavaScript 的文档选项


级别: 初级

娄丽军 (loulj@cn.ibm.com), 软件部售前工程师, IBM公司

2004 年 4 月 01 日

本文通过电信工单业务流程的实现,介绍了一种新的流程嵌套的建模方法.

大家知道,MQ Workflow是IBM用于业务流程管理的软件平台,帮助企业进行其业务流程重组(Business Process Reengineering)。在使用MQ Workflow的时候,我们需要进行以下几方面的工作:

  • 流程模型建立,流程建模工作是整个业务流程重组的一个很重要的工作,对于MQ Workflow而言,你可以使用它提供的配置工具(Buildtime工具),进行流程的定义。另外,MQ Workflow也提供了流程定义语言(Workflow Definition Language, 简称FDL),它是一种脚本语言,用户可以直接编写FDL,以生成流程模型的定义。
  • 流程运行,MQ Workflow提供了运行时(Runtime)流程服务引擎和流程运行环境。
  • 流程管理和监控,用户可以使用MQ Workflow提供的图形化的监控工具和相关的编程接口,来完成流程管理和监控。

在这三个方面中,流程分析和设计以及流程建模是整个工作的核心,它涉及到一些相关的技巧,在此,我们结合一个具体的案例,在给出该案例中具体业务流程模型的实现方法的同时,向读者介绍一种新的流程嵌套的建模方法,以及在流程建模过程中的一些经验和技巧,供用户参考。

1 业务需求描述

如图1所示,我们要为电信部门实现一个电信工单处理的流程,电信工单需要在各个业务部门,包括传输中心、区局、交换室、测量室以及线路室等部门之间处理和流转,并且要在这些部门之间实现以下几种不同类型的业务处理:

  • 工单正常下发
  • 工单报峻:每一级节点工单处理完成之后,向其上级节点报峻
  • 退单/工单重发:一般来说,退单操作可以跨级进行,即测量室可以选择将工单退回给哪个部门,被退回的部门在重新修改工单数据后,可以选择该工单是重发给所有下级部门,还是直接重发给原退单部门。

其他需求还包括:

(1)传输中心在收到三区局的完成回复和五区局的完成回复后,再将工单转交给长话局处理,长话局完成回复后,传输中心向网调中心报峻。

(2)测量室直接向区局做完成回复,向上一结点做收到回复。

(3)从传输中心到区局的过程中,由传输中心选择待选区局,待选是所有区局。

(4)只有网调中心可以撤单。


该工单处理流程是电信系统中一个典型的工单处理流程,也是电信业务中较为复杂的一个例子,它涉及了工单下发、退单、报俊、撤单等所有业务处理类型,并且涉及部门繁多,在电信业务中具有非常强的典型性和代表性,对该流程的实现将为其他业务流程的实现打下坚实的基础,并使之迎刃而解,本文将以之为例,给出其建模方法,并探讨一种新的流程建模手段。





回页首


2 在MQ Workflow中回退处理的建模方法和技巧

首先,我们先来谈一谈在MQ Workflow中回退处理的建模方法和技巧。


如图所示,这里的流程中涉及两个任务,在MQ中被称为活动(activity),它物理上是由某个应用(program)来实现的。若某用户的需求为,当活动A处理完之后,活动B进行处理;根据需要活动B处理完之后,可能会回退给活动A重新处理。通常在这种情况下,我们可以利用MQ Workflow提供的块(block)的手段进行处理。块(Block)是循环执行某一系列活动的一种方式,它通常是一个流程(process)的一部分,我们可以设定块的退出条件(exit condition),只有当整个块(block)的退出条件满足时,块(block)才会退出循环,结束执行。对块(block)的使用要注意以下方面:

首先,块(block)并不意味着高性能和高处理能力的循环。例如,使用一个块(block)去实现一个守候进程将是一个非常不合适的做法。正确的做法应该是,将该守候进程作为一个流程中调用的一个活动(activity)来处理。另外一个非常重要的因素是, 只用当一个块(block)中的所有活动(activity)都结束时,该块(block)才能结束。而一个活动(activity)结束的条件必须是以下三种情况之一:该活动(activity)本身运行结束或者该活动(activity)被强行终止(force finish)或者是进入一个死路径(dead path)导致该活动(activity)不会被执行。

在我们给出的工单处理流程中,如果我们把三区局、交换室、线路室以及测量室封装在一个块(block)之中,就会遇到上面的限制,如果交换室欲将工单退回给三区局,它需要立即退单,而不可能等待块(block)中的其他节点处理完之后再退单。

为此,我们给出回退处理的另外一种有效的手段,既利用子流程嵌套的方法。我们利用以下方法处理上述需求,仍以上述的小流程为例。


如图所示,我们创建这样两个流程,

流程a (Fa), 该流程由活动(activity) A和子流程Fb组成;

流程b (Fb), 该流程由活动(activity) B和子流程Fa组成;

当流程a执行时,在执行完活动A之后,会调用子流程Fb的执行,从而执行活动B,活动B执行完毕之后,如果需要回退,在条件满足的情况下会再调用流程Fb的子流程Fa,从而再一次执行活动A,实现了回退操作。

子流程的设计和使用是MQ Workflow提供的一个建模时非常方便并且功能强大的手段,子流程的使用可以大大提高系统的可重用性,任何流程都可以被重用为子流程。

当然,在使用子流程的时候,也要考虑子流程的一些特点。比如:子流程在运行时是被动态绑定的,在这个意义上,我们称之为后绑定(late binding)。在MQ Workflow中,当一个流程启动时,它才被实例化(instantiated),这时该流程模板才会被克隆到流程实例的数据库表中。从性能角度考虑,这同时意味着性能的下降,因为只有当子流程被调用时,它才被实例化,所以子流程的效率比块(block)还会略差。所以,当你从性能角度考虑时,可能块(block)是一个好的选择。

当你的多个流程都需要重用一个较为复杂的处理逻辑时,你可以将该处理逻辑封装为一个子流程。它的优势在于你可以对子流程修改一次,而如果使用块(block),你需要在调用它的所有地方做修改。

同时,子流程有很强的灵活性,因为,MQ Workflow提供了动态流程调用(dynamic process invocation)的功能,即我们可以将要调用的子流程的名字作为数据容器(data container)的一个字段,在流程执行过程中,动态获得该流程的名称,从而动态地调用相应的流程。本文给出的案例中就利用了这种方法。





回页首


3 具体设计思路

以下是相关的详细设计思路和实现方法。

3.1关于业务流程模型的创建

我们采用流程嵌套的方法来实现,采用该方法的优势非常明显,首先,思路清晰,功能灵活,对于一些特殊类型的业务需求可以灵活处理,其次,规律性较强,为应用程序建模工作奠定坚实的基础(备注:虽然MQWF自身的Buildtime组件专门提供了建模的功能,但是由于用户特殊的需求,我们无法使用该建模工具,而是需要通过应用程序自动生成与业务流程模型相对应的FDL文件)。


具体实现方法如下,以某一个业务部门为例,如以传输中心为例,其流程设计如下:

对每一个部门节点而言,我们这样设计其流程:

首先,流程中会包含一个与该部门业务处理相关的Activity(program),

其次,我们将其业务分为四类:

1 正常处理流程,正常情况下,它会将工单下发给其下级节点,我们用相应的子流程来实现,如:sub_yiquju_flow, sub_erquju_flow等(对应Status=1的情况);

2 退单/报俊操作,由于退单时,某一部门会动态选择将工单回退给其前面的任一部门,而报俊操作,也会根据业务规律报俊给特定的部门,在这里,我们利用MQWF的动态流程调用的功能,动态地赋予其退单/报俊部门的子流程的名称,在这里,我们统一用sub_back_flow来实现,具体sub-back_flow的名称将动态获得,此时的Status=2或3;

3 工单重发操作,在工单被退给某一部门之后,该部门会修改工单,然后重新下发,这时,它可以选择按正常情况下发给所有下级部门,或是下发给原退单部门。当下发给所有下级部门时,又会按照正常流程处理,为了处理下发给原退单部门的需求,我们同时嵌套与该部门对应的流程,既sub_back_flow之后,又会紧接sub_chuanshu_flow(即传输中心流程本身)。

以此类推,我们可以设计出每一个部门所对应的工作流程。

3.2FDL的生成

根据以上的建模思路,我们结合用户前端的基于Web的业务部门和基础流程定制工具,设计了专门的应用来生成相应的FDL。

在用户利用浏览器定制其业务部门和基础流程的时候,我们会将部门以及其上下级关系的信息写入数据库,同时根据数据库,查找每一个部门的上下级业务节点的信息,确定与每一个部门对应的流程中应包含的相关的子流程,然后调用我们开发的Java应用程序,自动化地生成FDL。

3.3实现业务流程的控制

在业务流程的控制方面,我们灵活地利用MQWF丰富的API实现了用户复杂而灵活的功能,用户在实现正常工单下发业务的同时,可以灵活地实现退单、报俊和重发、撤单等各项操作。

其中的关键设计思想和编程模式如下:

3.3.1 如何控制数据和控制在测量室的同步

当交换室和测量室结束其工单处理之后,会激活出两个测量室的子流程,如何同步这两个子流程,其实现方法如下:

首先判断两个父节点的状态,

若不是两个都完成,则:不做任何操作,直接退出;
如果两个都完成,则:获得当前任务项(WorkItem)的描述(description:其中包括工单号,它是工单的唯一标识)和流程标识(pid),查出属于该用户的所有任务项, 在这些任务项中,找出与当前任务项的描述相同、而pid不同的那个任务项,该任务项必定是两个相同子流程中的另外一支,利用API将其强制终止。

3.3.2 如何进行工单重发之前的退单操作

如果某一节点,如传输中心收到退单并且处理完退单之后,决定将修改过后的工单重新下发到其所有下级节点,则必须先进行撤单操作,既通知其所有下属节点中,所有正在对此单进行操作,或者将要对此单进行操作的那些节点进行撤单处理。

对于WorkFlow来说,就是需要将下属所有的子流程中的相关任务项撤销或强制终止。我们的实现方法如下:

首先获得系统中所有的流程实例(Process Instance)和当前的流程实例,根据流程模板(Process Template)的名称,沿着父节点开始层层向上遍历,直至遍历到与当前的流程模板名称相同的那个流程实例,获得其流程实例监视器(process instance monitor: 这是获得流程实例所有属性的一个API接口),通过该流程实例监视器,获得此流程下面的所有活动实例(Activity Instance):

对于类型为程序(Program)的那些活动实例,找出这些活动实例中状态为"Ready"或"Running"的活动(Activity),将其强行终止(force finish);

对于类型为子流程(Sub Process)的那些活动实例, 进行进一步的递归操作,进一步获得他们的子流程实例监视器, 将这些子流程实例中的状态为"Ready"和"Running"的那些活动(Activity)终止(force finish)掉。

3.3.3 如何实现网调中心的撤单

网调中心是一个唯一可以决定对某一个工单进行退单操作的部门,若它决定对某一个工单进行退单操作,则有必要终止所有业务部门对此工单的操作。为此,我们的做法如下:找出所有层次处于最顶层的流程实例(即根流程),根据用户选择,撤销其中一个,则终止掉与之相关的那个根流程的流程实例,从而其下属的所有子流程和活动(activity)都会随之被终止。

3.3.4 对于传输中心的操作

传输中心由于涉及长话局,同时该部门还存在退单/报俊/重发等各种业务操作,因此业务操作比较复杂,该部门的业务应用处理逻辑如下:

首先判断上一部操作的业务部门是否为"网调中心", 如果是,则进行工单的正常下发操作;

如果上一部操作的业务部门是"长话局",则进行报俊操作。

如果都不是,则进一步判断其状态,
若status=2(代表报俊),则判断是否所有的区局都完成,如果都完成,则强制终止其他报俊到传输中心的区局的子流程,然后向长话局报俊;如果其他区局没有完成,则等待其他区局一同报俊。
若 status=3(代表退单),则根据选择进行退单操作。

3.3.5 搭建测试环境,验证流程设计和流程逻辑控制实现成功。

首先,我们在Windows2000平台上完成了上述工作的程序开发和初步测试,之后,我们根据用户的实际环境,在Solaris平台上搭建测试环境,验证了流程设计和流程逻辑控制实现成功。在产品安装的过程中的注意事项主要是对Oracle数据库V8.1.7的补丁的要求,要求至少补丁2以上。

在这个具体案例中,IBM的工作流管理平台MQ Workflow很好地满足了最终用户的需求,并且展现了它本身特有的以下几方面的优势:

1 提供FDL建模语言和脚本,便于用户灵活定制其业务模型;

2 直接提供WebClient的管理,使用和Java编程接口以及JSP Wizard,便于Web应用的开发;

3 支持块(block),子流程(sub_process)等多种手段,便于用户灵活地设计其业务模型;

4 提供丰富灵活的API接口,可以实现对流程,流程中的各种运行对象的各种控制功能,如活动(activity)和子流程(sub process)等;

5 可以实现流程监控,任务分派,人员管理等功能,可以管理自动化运行的应用以及需要人工干预的应用。更为重要的是,通过该电信工单业务流程的实现,我们体会了一种新的流程嵌套的建模方法,大家可以在今后的实践中加以尝试。



关于作者

娄丽军( loulj@cn.ibm.com),IBM公司软件部售前工程师,1998年加入IBM公司软件部,四年来一直从事IBM通讯及业务整合中间件(WebSphere Business Integration家族)产品的技术支持工作,是软件部从事该领域技术支持时间最长的工程师之一,拥有WebSphere Business Integration相关的产品经验,这些产品包括WebSphere MQ家族的所有产品:MQSeries, MQ Integrator, MQ Workflow以及CrossWorlds等,并具有很多大型项目的支持经验,曾参与国家税务总局,人民银行清算系统、华夏银行电子联行系统、中国联通计费系统、海关与国家税务总局互连系统,以及公安部、铁道部、中信实业银行、电信等重要客户的有关项目的技术支持。




对本文的评价

太差! (1)
需提高 (2)
一般;尚可 (3)
好文章 (4)
真棒!(5)

建议?




回页首


IBM 公司保留在 developerWorks 网站上发表的内容的著作权。未经IBM公司或原始作者的书面明确许可,请勿转载。如果您希望转载,请通过 提交转载请求表单 联系我们的编辑团队。
    关于 IBM 隐私条约 联系 IBM 使用条款