用JBoss jBPM管理业务流程

        JBoss jBPM为设计及开发工作流和业务流程管理系统提供了一个先进的平台。由API、特定领域的语言和图形建模工具组成的框架让开发人员和业务分析人员能够使用通用平台进行沟通及操作。

         工作流管理和业务流程管理(BPM)正在迅速成为企业获得软件敏捷性和适应性的重要方法。JBoss jBPM是一个面向流程的工作流/BPM框架和工具集,它使业务分析人员能够与软件组件进行交互、有助于获得有效的业务解决方案。

许多企业在积极寻求一种结构化方法,以便设计业务动作/事务,并且优先使用自动化流程加以执行。业务流程管理(BPM)和工作流管理使用动作、任务和流程等概念,提供了解决这个问题的办法。

业务流程管理一词通常是指企业通过一系列活动,以能够适应动态变化的环境的方式,自动管理及优化流程。这些活动通常寻求来自软件工程和工具的帮助。因而,BPM一词往往直接用来指软件工程技术和工具。

BPM体现为三个不同的实践

1.流程设计:指设计现有及新的流程这一任务;

2.流程执行:执行自动化序列的相关事件,这些事件涉及软件流程以及/或者人为活动;

3.流程监控:观察及审查单个流程的状态,以便这些流程的统计数字和性能可以加以记录、报告及优化。

BPM力求让软件工程师们能够与业务分析人员共享同样的概念和框架,因而,软件开发商试图创建这样的工具,让企业可以通过使用图形建模工具、特定领域的语言和专有应用软件,获取、设计及优化业务流程。

JBoss jBPM 3.0提供了这样的功能:使用业务流程执行语言(BPEL)、灵活而且可插入的应用编程接口(API)、本地流程定义语言以及图形建模工具,利用基于行业标准的编制机制开发新的自动化业务流程和工作流。

JBoss jBPM是采用开放源代码(LGPL许可证)的框架,包括了Java API、工具和定义语言,可以充当Web应用或者独立的Java应用。JBoss jBPM相当于业务分析人员和开发人员之间的中介,为他们提供了名为jPDL的通用流程定义语言。


JBoss jBPM架构综述

JBoss jBPM定义了使用JBoss流程定义语言编写的文件里面的流程定义。jPDL是一种面向图形编程(GOP)的语言,它基于节点、转换和动作组成的模型。在这种模型里面,节点是在流程定义过程中彼此相遇时执行的命令。转换负责指导流程定义的执行过程,而动作在节点或者转换事件发生时执行特定逻辑。

在jBPM中,流程定义被封装成流程档案(process archives)。流程档案被传送到jPDL流程引擎加以执行。jPDL流程引擎负责遍历流程图、执行定义的动作、维持流程状态,并且记录所有流程事件。


JBoss jBPM在以下组件里面进行封装:


● 流程引擎: 该组件通过下列委托组件(delegate component)来执行定义的流程动作、维持流程状态,并记录所有流程事件:请求处理程序、状态管理程序、日志管理程序、定义加载程序、执行服务。

● 流程监管器: 该模块跟踪、审查及报告流程在执行时的状态。

● 流程语言: 流程定义语言(jPDL)基于GOP。

● 交互服务: 这些服务把遗留应用提供成流程执行时所用的功能或者数据。


图1表明了这些组件之间的关系。


如图1所示,含有动作处理程序的jBPM流程定义由jBPM流程引擎加以加载及执行。 如果流程引擎在流程定义过程中遇到拥有相关动作的节点,所有相关的动作处理程序就会被调用。动作处理程序是Java代码的实例,在执行时能够与外部系统进行交互。


下面就是简单的动作处理程序的示例:

import  org.jbpm.graph.def. *
import  org.jbpm.graph.exe. *
public   class  MyActionHandler 
implements  ActionHandler 

    
public void execute(ExecutionContext executionContext) 
 

        System.out.println(
"MyActionHandler has executed: " + executionContext); 
 }
 
}
 

      流程档案里面的PDL文件名为process-definition.xml。该文件含有诸流程的正式描述。以下示子表明了process-definition.xml文件的例子:

<  ?xml  version ="1.0"  encoding ="UTF-8" ? >  
<  !DOCTYPE  process-definition PUBLIC "-//jbpm/jBPM Mapping DTD 2.0//EN" "http://jBPM.org/dtd/processdefinition-2.0.dtd" >  
<  process-definition  name ="purchase process" >  
<  !-- ...-- >  

<  !--  START-STATE -- >  
<  start-state  name ="request a purchase" >  
 
<  transition  to ="evaluating" />  
<  /start-state >  

<  !--  NODES -- >  
<  state  name ="evaluating" >  
 
<  !-- ...-- >  
 
<  transition  name ="approve"  to ="purchase approved" />  
 
<  transition  name ="disapprove"  to ="done" />  
<  /state >  

<  fork  name ="purchase approved" >  
 
<  transition  to ="decrement inventory"   />  
 
<  transition  to ="increment revenue"   />  
<  /fork >  

<  state  name ="decrement inventory" >  
 
<  !-- ...-- >  
 
<  transition  to ="join"   />  
<  /state >  

<  state  name ="increment revenue" >  
 
<  !-- ...-- >  
 
<  transition  to ="join"   />  
<  /state >  

<  join  name ="join" >  
 
<  transition  to ="done"   />  
<  /join >  
<  !--  END-STATE -- >  

<  end-state  name ="done"   />  
<  /process-definition >  


流程定义基于定向图(directed graph)。有向图由节点、转换、一个起始状态以及一个终止状态组成。每个节点的类型定义了该节点的运行时行为。流程定义在执行时,以下实体就会起到作用:


● 流程实例: 流程实例是流程定义的一次执行。

● 标记: 标记是一条执行路径。标记是运行时概念,它含有指向定向图中节点的指针。一旦创建了流程实例,就会创建主要执行路径的标记。该标记名为流程实例的根标记,它位于流程定义的起始状态。

● 信号: 信号指示标记继续由转换实现的图像执行。

● 节点: 节点负责图像执行的继续进行。如果标记进入节点,节点就会执行。不会传播执行的节点被认为是状态节点。

● 动作:动作是流程执行过程中出现事件时执行的Java代码的实例。主要的事件类型有:“进入节点”、“离开节点”和“进行转换”。



图2 jBPM图形建模设计器

使用jBPM图形建模设计器,就很容易创建流程定义。设计器目前作为Eclipse插件而安装。图2表明了图形建模设计器的示例屏幕。


图形设计器可以用来创建流程定义、把动作处理程序与事件连接起来、编辑定义来源、创建流程档案、测试流程定义,等等。


部署JBoss jBPM


JBoss jBPM把流程定义存储在数据库中。因而,把流程部署到JBoss jBPM里面需要解析process-definition.xml,并且把它存储在JBoss jBPM数据库中。可通过以下方法实现这项工作:


● 使用由JBoss jBPM提供的par Ant任务来创建流程档案。

● 使用deploypar实用程序。该实用程序还可以创建流程档案,并且把流程档案部署到jBPM数据库上。Deploypar实用程序把jBPM.properties文件作为一个属性。该文件指定了配置选项,其中包括流程档案所要部署到的那个数据库。

● 通过编程解析process-definition.xml,并把它存储到数据存储区中。

让JBoss jBPM完成一些简单步骤

JBoss jBPM充当编制引擎,它位于企业应用的中间,能够实现不同应用之间的集成和协调。

本文使用随同jBPM交付的示例部署,讨论如何利用jBPM和jPDL来创建及修改具有Web功能的简单的订单处理系统。


1.下载JBoss jBPM


JBoss jBPM入门套件(http://www.jboss.com/products/jBPM/downloads)包括了执行JBoss jBPM所需的一切,只是没有Java开发者工具包(JDK)。JBoss jBPM入门套件里面的JBoss应用服务器需要J2SE 1.4或者更新版本。


下载入门套件后,把它解压缩到选择的目录下面。一旦解压缩了该入门套件,就有了类似如下的目录结构:

● Jbpm-starters-kit-3.1。

● Jbpm:含有JBoss jBPM产品的源代码。

● jbpm-bpel:含有JBoss jBPM的BPEL扩展件方面的信息。

● jbpm-db:含有把JBoss jBPM连接到其他数据库的示例配置。

● jbpm-designer:含有用于JBoss jBPM可视化流程设计器的Eclipse插件。

● jbpm-server:含有JBoss应用服务器和JBoss jBPM引擎以及示例流程。


2.执行JBoss jBPM引擎


为了启动部署了jBPM的JBoss应用服务器,进入jbpm-server目录,执行里面的启动脚本。命令窗口会随同jBPM控制台窗口一起出现,类似图3。



现在,打开浏览器窗口,输入http://localhost:8080/jbpm。就会看到JBoss jBPM的示例Web应用的登录页面。


以cookie monster用户的身份登录,选择“创建新的Web销售订单”链接。这会创建预制的“Web销售”流程的新实例,如图4所示。



实际的定义文件:processdefinition.xml位于websale.par里面,如以下列表所示:

<  ?xml  version ="1.0" ? >  
<  process-definition  name ="websale"   xmlns ="urn:jbpm.org:jpdl-3.1" >  

    
<  !--  SWIMLANES ( = process  roles) -- >  
        
<  swimlane  name ="buyer"   />  

    
<  swimlane  name ="salesman" >  
        
<  assignment  expression ="user(ernie)"   />  
    
<  /swimlane >  

    
<  swimlane  name ="accountant" >  
        
<  assignment  expression ="user(bert)"   />  
    
<  /swimlane >  

    
<  swimlane  name ="shipper" >  
       
<  assignment  expression ="user(grover)"   />  
    
<  /swimlane >  

    
<  !--  NODES -- >  

    
<  start-state  name ="create new web sale order" >  
        
<  task  swimlane ="buyer" >  
            
<  controller >  
                
<  variable  name ="item" />  
                
<  variable  name ="quantity" />  
                
<  variable  name ="address" />  
            
<  /controller >  
        
<  /task >  
        
<  transition  to ="evaluate web order"   />  
    
<  /start-state >  

    
<  task-node  name ="evaluate web order" >  
        
<  task  swimlane ="salesman" >  
            
<  timer  duedate ="20 seconds"  repeat ="10 seconds" >  
                
<  action  class ="org.jbpm.websale.RemindActor" >  
                    
<  swimlaneName > salesman <  /swimlaneName >  
                
<  /action >  
            
<  /timer >  
            
<  controller >  
                
<  variable  name ="item"  access ="read" />
                
<  variable  name ="quantity"  access ="read" />  
                
<  variable  name ="address"  access ="read" />  
                
<  variable  name ="comment" />  
            
<  /controller >  
        
<  /task >  
        
<  transition  name ="ok"  to ="salefork"   />  
        
<  transition  name ="more info needed"  to ="fix web order data"   />
    
<  /task-node >
 
    
<  task-node  name ="fix web order data" >  
        
<  task  swimlane ="buyer" >  
            
<  controller >  
                
<  variable  name ="comment"  access ="read" />
                
<  variable  name ="item"   />  
                
<  variable  name ="quantity"   />  
                
<  variable  name ="address"   />  
            
<  /controller >  
        
<  /task >  
        
<  transition  to ="evaluate web order"   />  
    
<  /task-node >  

    
<  fork  name ="salefork" >  
        
<  transition  name ="payment"  to ="wait for money"   />
        
<  transition  name ="shipping"  to ="ship item"   />  
    
<  /fork >  

    
<  task-node  name ="wait for money" >  
        
<  task  swimlane ="accountant" >
            
<  controller >  
                
<  variable  name ="item"  access ="read"   />  
                
<  variable  name ="quantity"  access ="read"   />
                
<  variable  name ="address"  access ="read"   />  
                
<  variable  name ="money received"   />
            
<  /controller >  
        
<  /task >  
        
<  transition  to ="update books"   />  
    
<  /task-node >  

    
<  node  name ="update books" >  
        
<  action  class ="org.jbpm.websale.UpdateBooks" >  
            
<  msg > accountancy application is now informed of the payment <  /msg >
        
<  /action >  
        
<  transition  to ="salejoin"   />  
    
<  /node >  

    
<  node  name ="ship item" >  
        
<  action  class ="org.jbpm.websale.ShipItem" >  
            
<  swimlaneName > shipper <  /swimlaneName >  
            
<  msg > ${shipper} now ships ${item} to ${address} <  /msg >  
        
<  /action >  
        
<  transition  to ="salejoin"   />  
    
<  /node >  

    
<  join  name ="salejoin" >
        
<  transition  to ="end"   />  
    
<  /join >  

    
<  end-state  name ="end"   />  

<  /process-definition >  


一旦“创建新的Web销售订单”页面加载完毕,填写“物品”和“数量”表格字段,其中cookie作为物品,1作为数量。然后选择“保存”和“结束任务”,即可完成“创建新的Web销售订单”任务。Web应用会向jBPM发出信号,要求把Web销售流程标记转移到“评估Web订单”任务,然后使用输入数据作为流程变量。这时候,登录页面会再次显示。你会注意到这样一则消息:“新的任务已分配给‘ernie’。”


现在,选择“以另一个用户登录”链接、以ernie的身份登录。你会注意到:“评估Web订单”任务呈高亮显示。把所需地址输入到注释字段,然后选择“需要更多信息”按钮。这样就可以把流程标记转移到“修复Web订单数据”任务,并且让浏览器回到登录页面。


这时候,可以以cookie monster用户的身份登录,选择“修复Web订单数据”链接,就可以查看高亮显示的任务如何变化、体现流程标记在执行流程中的位置。


重复流程定义在浏览器窗口中显示的步骤,出现提示时以相应用户的身份登录,完成填写每项新任务的表格。你最终会进入到流程末端,这时就会出现屏幕,告诉你流程已完成。 

本文转自
http://www.cnpoint.com/framwwork/2006/0902/content_293.htm

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值