JBoss jBPM – java 工作流

              jBPM jPDL 用户开发手册
                                              3.2.3




cncsi hlj br...
目录
目录 .......................................................................................................................
4.3.4. 异步连续 .................................................................................................................
7.1.1.配置框架关系 ........................................................................................................ 75
 ...
10.3.4. decision 节点类型 ............................................................................................ 124
   ...
12.7. 开始任务中的泳道 ..................................................................................................... 148
 ...
18.1.2. 测试部署 .......................................................................................................... 17...
21.4.25. 泳道..................................................................................................................
第 1 章 介绍
  jBoss jBPM 是一个灵活、可扩展的流程语言框架。jPDL 是建立在这个通用框架之上的
一个流程语言。它使用直观的流程语言以图形化的方式来表示业务流程,使用术语任务、异
步通讯等待状态、定时器、自动操作等。为了将这些...
下内容:

    •   config:标准 java 环境的配置文件
    •   db:创建数据库的 SQL 脚本文件以及兼容性信息
    •   designer:用来创作jPDL 流程的eclipse插件,以及安装脚本(这部分内容...
1.5. jBPM 核心库

  JBoss jBPM 核心组件是一个纯 java(J2SE)库,用来管理流程定义和流程实例执行的
运行时环境。

     JBoss jBPM 是一个 java 库。因此,它能够在任何一个 java 环境上使...
第 2 章 正式开始
     本章将带你完成第一步,获得 JBoss jBPM 并给出立即开始运行基本的指南。


2.1. 下载包概述

  下面列出的是当前可用的不周的 jBPM 包。每个包都包含了一个或更多的可下载的文
件。连同这些文件...
•    Eclipse 特性包(jbpm-gpd-feature-<version>.zip):如果你讨厌不得不每次都
          刷新 Eclipse 的安装,并且你愿意去处理一些可能会发生的问题的话,你可以试着
         ...
•    用户名: sf.net 用户名或 jboss 用户名
          •    主机:cvs.forge.jboss.com
          •    端口:2401 (缺省)
          •    库路径: /cvs...
第 3 章 教程
     本教程将向你展示使用 jpdl 构建基本流程及管理运行时执行的 API 的使用方法。

  教程的方式是解释一系列的例子,           每个例子以特定的主题为焦点并包含大量的注释。这
些例子在 jBPM 下载...
import org.jbpm.graph.def.ProcessDefinition;

import org.jbpm.graph.exe.ProcessInstance;

import org.jbpm.graph.exe.Token;...
ProcessInstance processInstance = new ProcessInstance(processDefinition);




          // 创建流程执行的主路径 (=root token)

     ...
}

译者注:以上的代码是可执行的 Junit 测试用例程序,复制到 eclipse 中即可执行。与原文档的代码有所差
异。但主测试方法是完全一样的。



3.2. Database 实例

  jBPM 的基本属性之一就是流程在等待状态时,...
static JbpmConfiguration jbpmConfiguration = null;




  static {




     // 实例配置文件,例如此文件能够在 src/config.files 文件夹下找到。

  ...
" <string name='resource.hibernate.cfg.xml' " +

           "           value='hibernate.cfg.xml' />" +

           " <str...
public void tearDown() {

      jbpmConfiguration.dropSchema();

  }




  public void testSimplePersistence() {




     ...
// 未命名的开始状态、状态's'和一个命名为'end'的结束状态

    ProcessDefinition processDefinition = ProcessDefinition.parseXmlString(

         "...
}

  }




  public void processInstanceIsCreatedWhenUserSubmitsWebappForm() {

      // 在方法里的代码能够放在struts-ation或JSF管理bean...
token.signal();

          // 现在流程是在状态's'。

          assertEquals("s", token.getNode().getName());




          // 现在 pr...
程实例的所有列表.

       // 那样就只给我们一个结果.所以让我们查看流程定义.




       ProcessDefinition processDefinition =

            graphSession.f...
} finally {

            // 拆毁pojo持久性上下文。

            jbpmContext.close();

        }

    }

}




译者注:以上的代码是可执行的 Junit ...
public void     testProcessVaribles(){

          // 这个例子还是从hello world流程开始,这次甚至没有修改.

          ProcessDefinition process...
contextInstance.setVariable("amount", new Integer(500));

          contextInstance.setVariable("reason", "i met my deadli...
package org.zym;




import junit.framework.TestCase;

import org.jbpm.graph.def.ProcessDefinition;

import org.jbpm.graph...
class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />"

                               +"      </task>" + "     <tr...
// 现在我们检查任务实例是否真正的赋给了 'papa'.

           assertEquals("papa", taskInstance.getActorId());




           // 现在我们假设爸爸已经完成了...
public void assign(Assignable assignable, ExecutionContext executionContext) {

        assignable.setActorId("papa");

  ...
// 动作设置 isExecuted 值为 true,以至于当动作正在被执行时单元测试中能够显示

     public void execute(ExecutionContext executionContext) throws Excep...
// 每个测试将要开始时会设置 MyActionHandler 的静态成员 isExecuted 的值为 false

     public void setUp() {

          MyActionHandler.isExecut...
ProcessInstance processInstance = new ProcessInstance(processDefinition);




          // 下一个信号将导致执行离开开始状态并进入状态's'.

    ...
package org.zym;




import junit.framework.TestCase;




import org.jbpm.graph.def.ProcessDefinition;

import org.jbpm.gr...
+"        <action class='org.jbpm.tutorial.action.MyActionHandler' />"

                               +"      </event>"

...
}

}




cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/   第 38 页 / 共 199
页
第 4 章 面向图的程序设计
4.1. 介绍

    本章可以给出 JBoss jBPM 的明细单,完整的愿景概览、当前战略下的理念以及 JBoss
jBPM 项目未来的方向。这一愿景和传统的取向相比有极大的不同。

  首先,我们相信复合流...
4.1.1. 域特定语言

  每一流程语言都能被认为是一个领域特定语言(Domain Specific Language ,DSL)。DSL
透视图让开发人员能很好的理解流程语言和纯 OO 程序设计如何关联的。

  本节也许会留下我们单纯地...
但它之后的愿景在Martin的关于《Language Workbenches》的文章中有更加详细的说明。


4.1.2. 基于图的语言的属性

  有为数众多的基于图的流程语言。在环境和焦点里有很大的不同。举例来讲,BPEL 作
为一个 XM...
在大多数的应用领域,   执行必须在等待状态时被持久化。         那也就是为什么只阻塞线程是
不足够的原因。聪明的 Java 程序员也许会考虑 Object.wait()和 Object.notify()方法。那种处理
用于模拟等待状态...
我们将用最简单的可能模型来开始并一点点的扩展它。


4.2.1. 图结构

  首先,图的结构是用节点(Node)和转换(Transition)类来表示的。一个转换有一个
方向,因此节点具有了离开和到达转换(的事件) 。


        ...
节点


                        +execute(in Execution e) : void


                              图 4-5 节点(Node)的 execute 方法

 ...
Node


                                         +execute() : void




            StartState            Decision          ...
开始销售:开始状态



     e:Execution                                              条件(amount>5K)

                                ...
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
J Boss+J Bpm+J Pdl用户开发手册 3.2.3
Upcoming SlideShare
Loading in...5
×

J Boss+J Bpm+J Pdl用户开发手册 3.2.3

2,300

Published on

0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
2,300
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
29
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

J Boss+J Bpm+J Pdl用户开发手册 3.2.3

  1. 1. JBoss jBPM – java 工作流 jBPM jPDL 用户开发手册 3.2.3 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 1 页 / 共 199 页
  2. 2. 目录 目录 .................................................................................................................................................. 2 第 1 章 介绍..................................................................................................................................... 9 1.1. 概述................................................................................................................................... 9 1.2. jPDL 套件 .......................................................................................................................... 9 1.3. jPDL 图形流程设计器 .................................................................................................... 10 1.4. jBPM web 控制台 ........................................................................................................... 10 1.5. jBPM 核心库 ................................................................................................................... 11 1.6. JBoss jBPM 身份组件 ..................................................................................................... 11 1.7. JBoss jBPM 工作执行器 ................................................................................................ 11 第 2 章 正式开始........................................................................................................................... 12 2.1. 下载包概述..................................................................................................................... 12 2.1.1. jPDL 3 ................................................................................................................... 12 2.1.2. jPDL 流程设计器 ................................................................................................ 12 2.2. JBoss jBPM 项目目录 .................................................................................................... 13 2.3. 访问源代码 CVS 服务器 ............................................................................................... 13 2.3.1. 匿名 CVS 访问 ................................................................................................... 13 2.3.2. 开发人员 CVS 访问 .......................................................................................... 13 第 3 章 教程................................................................................................................................... 15 3.1. Hello World 实例 ............................................................................................................ 15 3.2. Database 实例 ................................................................................................................. 18 3.3. Context 实例:流程变量 ............................................................................................... 26 3.4. Task 分配实例 ................................................................................................................ 28 3.5. 自定义动作实例 ............................................................................................................. 32 第 4 章 面向图的程序设计 ........................................................................................................... 39 4.1. 介绍................................................................................................................................. 39 4.1.1. 域特定语言 .......................................................................................................... 40 4.1.2. 基于图的语言的属性 .......................................................................................... 41 4.2. 面向图的程序设计 ......................................................................................................... 42 4.2.1. 图结构.................................................................................................................. 43 4.2.2. 执行...................................................................................................................... 43 4.2.3. 流程语言 .............................................................................................................. 44 4.2.4. 动作...................................................................................................................... 46 4.2.5. 同步执行 .............................................................................................................. 47 4.2.6. 代码示例 .............................................................................................................. 48 4.3. 面向扩展图的程序设计 ................................................................................................. 48 4.3.1. 流程变量 .............................................................................................................. 48 4.3.2. 并发执行 .............................................................................................................. 48 4.3.3. 流程组成 .............................................................................................................. 50 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 2 页 / 共 199 页
  3. 3. 4.3.4. 异步连续 .............................................................................................................. 50 4.3.5. 持久化和事务 ...................................................................................................... 51 4.3.6. 服务和环境 .......................................................................................................... 52 4.4. 注意事项......................................................................................................................... 52 4.4.1. 运行时数据隔离 .................................................................................................. 52 4.4.2. GOP 与其他技术相比 .......................................................................................... 53 4.4.3. GOP 与 Petri 网比较 ........................................................................................... 53 4.5. 应用领域......................................................................................................................... 54 4.5.1. 业务流程管理 (BPM) ......................................................................................... 54 4.5.2. 服务编排 .............................................................................................................. 56 4.6. 基于嵌入图的语言 ......................................................................................................... 56 4.7. 市场................................................................................................................................. 56 4.7.1. 终极流程语言 ...................................................................................................... 56 4.7.2. 相关信息 .............................................................................................................. 57 4.7.3. 其他实现技术 ...................................................................................................... 57 第 5 章 部署................................................................................................................................... 58 5.1. jBPM 库 .......................................................................................................................... 58 5.2. Java 运行时环境.............................................................................................................. 58 5.3. 第三方库......................................................................................................................... 58 5.4. Web 应用 ......................................................................................................................... 59 5.5. 企业包............................................................................................................................. 60 5.6. jPDL 运行时和套件 ........................................................................................................ 61 5.6.1. 运行时.................................................................................................................. 61 5.6.2. 套件...................................................................................................................... 61 5.6.3. 在套件服务器上配置日志 .................................................................................. 61 5.6.4. 在套件里调试流程 .............................................................................................. 62 第 6 章 配置................................................................................................................................... 64 6.1. 配置工厂......................................................................................................................... 67 6.2. 配置属性......................................................................................................................... 68 6.3. 其他的配置文件 ............................................................................................................. 68 6.3.1. Hibernate cfg xml 文件 ........................................................................................ 68 6.3.2. Hibernate 查询配置文件 ..................................................................................... 68 6.3.3. 节点类型配置文件 .............................................................................................. 69 6.3.4. 动作类型配置文件 .............................................................................................. 69 6.3.5. 业务日历配置文件 .............................................................................................. 69 6.3.6. 变量映射配置文件 .............................................................................................. 69 6.3.7. 转换器配置文件 .................................................................................................. 69 6.3.8. 缺省模型配置文件 .............................................................................................. 69 6.3.9. 流程包解析配置文件 .......................................................................................... 70 6.4. 在 JBoss 中的 jBPM 调试日志 .................................................................................... 70 6.5. 乐观并发异常日志 ......................................................................................................... 70 6.6. 对象工厂......................................................................................................................... 70 第 7 章 持久化............................................................................................................................... 75 7.1. 持久化 API ..................................................................................................................... 75 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 3 页 / 共 199 页
  4. 4. 7.1.1.配置框架关系 ........................................................................................................ 75 7.1.2. JbpmContext 上的方便方法 ................................................................................ 76 7.1.3. 管理事件 .............................................................................................................. 79 7.1.4. 注入 hibernate session ......................................................................................... 80 7.1.5. 在程序中注入资源 .............................................................................................. 81 7.1.6. 高级 API 使用 .................................................................................................... 81 7.2. 配置持久化服务 ............................................................................................................. 82 7.2.1. DbPersistenceServiceFactory ................................................................................ 82 7.2.2. hibernate 会话工厂 ............................................................................................... 83 7.2.3. 配置 c3po 连接池 ................................................................................................ 84 7.2.4. 配置 ehcache cache provider ............................................................................... 84 7.3. Hibernate 事务 ................................................................................................................. 84 7.4. JTA 事务 ......................................................................................................................... 84 7.5. 定制查询......................................................................................................................... 86 7.6. 数据库兼容性 ................................................................................................................. 87 7.6.1. JDBC 隔离级 ........................................................................................................ 87 7.6.2. 变更 jBPM 数据库 .............................................................................................. 87 7.6.3. jBPM 数据库模式 ................................................................................................ 87 7.6.4. 已知问题 .............................................................................................................. 88 7.7.合并 hibernate 类 .............................................................................................................. 88 7.8. 定制 jBPM hibernate 映射文件 ..................................................................................... 88 7.9. 二级缓存......................................................................................................................... 88 第 8 章 jBPM 数据库 ................................................................................................................... 90 8.1. 切换后端数据库 ............................................................................................................. 90 8.1.1. 隔离级别 .............................................................................................................. 90 8.1.2. 安装 PostgreSQL 数据库管理器 ........................................................................ 90 8.1.3. 安装 MySQL 数据库管理器 ............................................................................... 93 8.1.4. 使用 PostGreSQL 或 MySQL 创建 JBoss jBPM 数据库.................................. 94 8.1.5. 最后一步 .............................................................................................................. 98 8.1.6. 更新 JBoss jBPM 服务器配置 ............................................................................ 99 8.2.数据库升级..................................................................................................................... 103 8.3. 在 JBoss 上开始 hsqldb 管理器 ................................................................................... 106 第 9 章 Java EE 应用服务器工具 ............................................................................................... 109 9.1. EJB ................................................................................................................................. 109 9.2. jBPM 企业配置 ............................................................................................................. 110 9.3. Hibernate 企业配置 ....................................................................................................... 112 9.4. 客户端组件................................................................................................................... 114 第 10 章 流程建模....................................................................................................................... 120 10.1. 概述............................................................................................................................. 120 10.2. 流程图......................................................................................................................... 120 10.3. 节点............................................................................................................................. 123 10.3.1. Node 职责 ......................................................................................................... 123 10.3.2. task-node 节点类型 .......................................................................................... 124 10.3.3. state 节点类型 .................................................................................................. 124 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 4 页 / 共 199 页
  5. 5. 10.3.4. decision 节点类型 ............................................................................................ 124 10.3.5. fork 节点类型 ................................................................................................... 125 10.3.6. join 节点类型 ................................................................................................... 125 10.3.7. node 节点类型 .................................................................................................. 125 10.4. 转换............................................................................................................................. 125 10.5. 动作............................................................................................................................. 126 10.5.1. 动作配置 .......................................................................................................... 128 10.5.2. 动作引用 .......................................................................................................... 128 10.5.3. 事件.................................................................................................................. 128 10.5.4. 事件传播 .......................................................................................................... 128 10.5.5. 脚本.................................................................................................................. 128 10.5.6. 定制事件 .......................................................................................................... 130 10.6. 超级状态..................................................................................................................... 130 10.6.1. 超级状态转换 .................................................................................................. 130 10.6.2. 超级状态事件 .................................................................................................. 130 10.6.3. 分层命名 .......................................................................................................... 131 10.7. 异常处理..................................................................................................................... 132 10.8. 流程组成..................................................................................................................... 132 10.9. 定制节点行为 ............................................................................................................. 133 10.10. 图执行....................................................................................................................... 134 10.11. 事务划分 ................................................................................................................... 135 第 11 章 上下文 ........................................................................................................................... 138 11.1. 访问变量 ..................................................................................................................... 138 11.2. 变量生存期 ................................................................................................................. 139 11.3. 变量持久化 ................................................................................................................. 139 11.4. 变量范围 ..................................................................................................................... 139 11.4.1. 变量重载 .......................................................................................................... 139 11.4.2.变量重写 ............................................................................................................ 139 11.4.3. 任务实例变量范围 .......................................................................................... 140 11.5. 瞬态变量 ..................................................................................................................... 140 11.6. 定制变量持久化 ......................................................................................................... 140 第 12 章 任务分配....................................................................................................................... 142 12.1. 任务............................................................................................................................. 142 12.2. 任务实例..................................................................................................................... 142 12.2.1. 任务实例生存期 .............................................................................................. 142 12.2.2. 任务实例和图执行 .......................................................................................... 143 12.3. 分派............................................................................................................................. 144 12.3.1. 分派接口 .......................................................................................................... 144 12.3.2. 分派数据模型 .................................................................................................. 145 12.3.3. 个人任务列表 .................................................................................................. 145 12.3.4. 群组任务列表 .................................................................................................. 145 12.4. 任务实例变量 ............................................................................................................. 146 12.5. 任务控制器 ................................................................................................................. 146 12.6. 泳道............................................................................................................................. 148 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 5 页 / 共 199 页
  6. 6. 12.7. 开始任务中的泳道 ..................................................................................................... 148 12.8. 任务事件..................................................................................................................... 149 12.9. 任务定时器 ................................................................................................................. 149 12.10. 定制任务实例 ........................................................................................................... 149 12.11. 身份构件 ................................................................................................................... 149 12.11.1. 身份模型 ........................................................................................................ 150 12.11.2. 分派表达式 .................................................................................................... 150 12.11.3. 移除身份组件 ................................................................................................ 152 第 13 章 文档管理....................................................................................................................... 153 第 14 章 定时器........................................................................................................................... 154 14.1. 定时器......................................................................................................................... 154 14.2. 调度部署..................................................................................................................... 155 第 15 章 异步连续....................................................................................................................... 156 15.1. 概念............................................................................................................................. 156 15.2. 示例............................................................................................................................. 156 15.3.工作执行器................................................................................................................... 158 15.4. jBPM 内置异步消息 ................................................................................................... 160 15.5. 异步架构 JMS ............................................................................................................ 161 15.6. 属性用法..................................................................................................................... 161 第 16 章 商务日历....................................................................................................................... 162 16.1. 到期日期..................................................................................................................... 162 16.1.1. 持续时间.................................................................................................................. 162 16.1.2. 基准日期.................................................................................................................. 162 16.1.3. 示例.......................................................................................................................... 163 16.2. 日历配置..................................................................................................................... 163 第 17 章 邮件支持....................................................................................................................... 165 17.1. jPDL 中的邮件 ............................................................................................................ 165 17.1.1. 邮件动作 .......................................................................................................... 165 17.1.2. 邮件节点 .......................................................................................................... 166 17.1.3. 任务分派邮件 .................................................................................................. 166 17.1.4. 任务提醒邮件 .................................................................................................. 166 17.2. 邮件表达式 ................................................................................................................. 166 17.3. 指定收件人 ................................................................................................................. 167 17.3.1. 多个收件人 ...................................................................................................... 167 17.3.2. 密送邮件 .......................................................................................................... 167 17.3.3. 地址解析 .......................................................................................................... 167 17.4. 邮件模板..................................................................................................................... 168 17.5. 邮件服务器配置 ......................................................................................................... 169 17.6. From 地址配置 ............................................................................................................ 169 17.7. 自定义邮件支持 ......................................................................................................... 169 17.8. 邮件服务器 ................................................................................................................. 170 第 18 章 Web Services 支持 ........................................................................................................ 171 18.1. 调用 jPDL Web Services............................................................................................. 171 18.1.1. 部署.................................................................................................................. 171 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 6 页 / 共 199 页
  7. 7. 18.1.2. 测试部署 .......................................................................................................... 171 第 19 章 日志............................................................................................................................... 172 19.1. 创建日志..................................................................................................................... 172 19.2. 日志配置..................................................................................................................... 173 19.3. 日志检索..................................................................................................................... 174 19.4.数据仓库....................................................................................................................... 174 第 20 章 业务流程仿真 ............................................................................................................... 175 第 21 章 jBPM 流程定义语言(JPDL) ................................................................................... 176 21.1. 流程包......................................................................................................................... 176 21.1.1. 部署流程包 ...................................................................................................... 176 21.1.2. 流程版本控制 .................................................................................................. 176 21.1.3. 变更已部署流程定义 ...................................................................................... 177 21.1.4. 迁移流程实例 .................................................................................................. 177 21.1.5. 流程转换 .......................................................................................................... 177 21.2.委托............................................................................................................................... 178 21.2.1. jBPM 类加载器 ................................................................................................ 178 21.2.2. 流程类加载器 .................................................................................................. 178 21.2.3. 委托配置 .......................................................................................................... 178 21.3. 表达式......................................................................................................................... 180 21.4. jPDL xml 模式 ............................................................................................................. 181 21.4.1. 验证.................................................................................................................. 181 21.4.2. 流程定义 .......................................................................................................... 181 21.4.3. 节点.................................................................................................................. 182 21.4.4. 通用节点元素 .................................................................................................. 182 21.4.5. 开始状态 .......................................................................................................... 182 21.4.6. 结束状态 .......................................................................................................... 183 21.4.7. 状态.................................................................................................................. 183 21.4.8. 任务节点 .......................................................................................................... 183 21.4.9. 流程状态 .......................................................................................................... 184 21.4.10. 超级状态 ........................................................................................................ 184 21.4.11. 分支 ................................................................................................................ 184 21.4.12. 合并................................................................................................................ 184 21.4.13. 决策................................................................................................................ 184 21.4.14. 事件................................................................................................................ 185 21.4.15. 转换................................................................................................................ 185 21.4.16. 动作................................................................................................................ 186 21.4.17. 脚本................................................................................................................ 186 21.4.18. 表达式 ............................................................................................................ 187 21.4.19. 变量................................................................................................................ 187 21.4.20. 句柄................................................................................................................ 187 21.4.21. 定时器 ............................................................................................................ 188 21.4.22. 创建定时器 .................................................................................................... 188 21.4.23. 撤消定时器 .................................................................................................... 189 21.4.24. 任务................................................................................................................ 189 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 7 页 / 共 199 页
  8. 8. 21.4.25. 泳道................................................................................................................ 190 21.4.26. 分派................................................................................................................ 190 21.4.27. 控制器 ............................................................................................................ 191 21.4.28. 子流程 ............................................................................................................ 191 21.4.29. 条件................................................................................................................ 191 21.4.30. 异常处理程序 ................................................................................................ 192 第 22 章 安全............................................................................................................................... 192 22.1. 要做的事..................................................................................................................... 192 22.2. 认证............................................................................................................................. 192 22.3. 授权............................................................................................................................. 193 第 23 章 工作流的 TDD 文件 .................................................................................................... 194 23.1.工作流 TDD 介绍 ........................................................................................................ 194 23.2. XML 源 ........................................................................................................................ 195 23.2.1. 解析流程包 ...................................................................................................... 195 23.2.2.解析 xml 文件.................................................................................................... 196 23.2.3. 解析 XML 字符串 ........................................................................................... 196 23.3. 测试子流程 ................................................................................................................. 196 第 24 章 可插拨架构................................................................................................................... 197 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 8 页 / 共 199 页
  9. 9. 第 1 章 介绍 jBoss jBPM 是一个灵活、可扩展的流程语言框架。jPDL 是建立在这个通用框架之上的 一个流程语言。它使用直观的流程语言以图形化的方式来表示业务流程,使用术语任务、异 步通讯等待状态、定时器、自动操作等。为了将这些操作绑定在一起,jPDL 提供了强有力 的、可扩展的流程控制机制。 jPDL 有一个具有最小的依赖性和尽可能简单易用的 java 库。但它也能被部署在高吞吐 量极为关键的 J2EE 集群应用服务器的环境里。 jPDL 能够使用任何数据库来进行配置,同时也能任何应用服务器上进行部署。 1.1. 概述 核心工作流和 BPM 功能被封装成一个简单的 java 库,它包含了一个用来管理和执行 jPDL 数据库中流程的服务。 图 1-1 jPDL 组件概况 1.2. jPDL 套件 这个套件中包含了捆绑在一起的所有 jBPM 组件的组成的简易下载包。下载包中包括以 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 9 页 / 共 199 页
  10. 10. 下内容: • config:标准 java 环境的配置文件 • db:创建数据库的 SQL 脚本文件以及兼容性信息 • designer:用来创作jPDL 流程的eclipse插件,以及安装脚本(这部分内容不包含在 仅jpdl的下载中)。请参考:1.3 节 jPDL图形流程设计器。 • doc:用户手册和 javadoc 文档 • examples • lib:jbpm依赖的库文件. 需要更多的信息请参考:5.3 节 第三方库文件 • server:包含内置 jbpm 控制台 web 应用程序的预先配置好的 JBoss 服务器(这部分内 容不包含在仅 jpdl 的下载中) • src: jbpm 和身份组件(identity component)的源代码 预配置的 JBoss 应用服务器已经安装了以下组件: • Web 控制台打包成一个 web 包。控制台既能够被流程的参与者,也可以由 jBPM 管 理员来使用。 • 工作执行器扮演定时器和异步消息的角色。 在控制台的 web 应用中有一个 servlet 上 下文件监听器,用来执行工作执行器,它产生一个线程池来执行定时器和异步消息。 • jBPM 数据库,包含 jBPM 表的一个内置流程(in-process)的 hypersonic 数据库。 • 已部署进 jBPM 数据库中的示例流程。 • 身份组件库是 web 控制台应用的一部分。在数据库中的身份组件表(那些表以 “JBPM_ID_”开头 )是有效的。 1.3. jPDL 图形流程设计器 jPDL 也包含一个图形化的流程设计工具。这个设计器是创作业务流程的图形化工具。 它是一个 eclipse 插件。 流程设计工具最重要特性就是,不但支持业务分析人员,同时也很好的支持技术开发人 员。它允许从业务流程建模到实际实现之间的平滑转换。 这个插件既可以使用本地更新站点(纯 zip 文件)的方式,来通过标准的 eclipse 软件更 新机制来进行安装,同时也有一个可以将其解压到你的 eclipse 的安装目录来完成安装的功 能包。 1.4. jBPM web 控制台 jBPM web 控制台服务于两个目标。首先,作为一个中央用户接口作用于流程执行所生 成的运行时任务。其次,它是一个管理和监控控制台,控制台允许检查和操作运行时实例。 再有的功能就是业务活动的监控。这些是流程执行的统计信息,他们有助于管理人员找 出瓶颈或其他的优化方法。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 10 页 / 共 199 页
  11. 11. 1.5. jBPM 核心库 JBoss jBPM 核心组件是一个纯 java(J2SE)库,用来管理流程定义和流程实例执行的 运行时环境。 JBoss jBPM 是一个 java 库。因此,它能够在任何一个 java 环境上使用,例如:web 应 用、swing 应用、EJB、Webservice 等等。jBPM 库也能够当作一个无状态会话 EJB(stateless session EJB)打包并发布。这样就适合具有极高的吞量要求场合的集群部署和伸缩性。无状 态会话 EJB 在 J2EE 1.3 规范的基础上进行重写, 这样它就可以部署在任何的应用服务器上。 依靠你所使用的功能,jbpm-jpdl.jar 库文件有一些依赖于其他的第三方库。例如 hibernate、dom4j 和其他的库。我们已经付出了极大的努力来要求那些仅仅是你真正使用的 依赖库文件。这些依赖在 第 5 章 部署 中有更多的整理文档。 对于它的持久化,jBPM 内部使用 hibernate。除了传统的 O/R 映射外,hibernate 也能解 决在不同的数据库间的 SQL 方言的差异, 使得 jBPM 可以在目前所有的数据库间进行迁移。 JBoss jBPM API 能够被项目中的任何自定义的 java 软件访问,例如 web 应用、EJB、 web service 组件、消息驱动 bean(message driven beans)或任何其他 java 组件。 1.6. JBoss jBPM 身份组件 JBoss jBPM 能够同包含用户和其他的组织结构信息的企业目录进行整合。但对于项目 来讲,是不会轻易地找到组织结构信息组件的,正因为如此,JBoss jBPM 自身就提供了这 个组件。身份组件使用的模型比传统的 servlet、ejb 和 portlet 所使用的模型更加丰富。 了解更多的信息,请参考:12.11 身份组件 1.7. JBoss jBPM 工作执行器 工作执行器是一个在标准 Java 环境中用来监控和执行工作的组件。用于定时器和异步 消息。在一个企业环境里,JMS 和 EJB 定时服务能够用于此目的。相反,工作执行器能够 用在既没有 JMS 也没有 EJB 的环境里。 可以注册 JobExecutorLauncher servlet 上下文监听器在 web 应用的部署描述符中开始/ 停止工作执行器在创建/销毁 servlet 上下文期这一期间, 也可以开始独立的 JVM 并启动程序 化的工作执行器。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 11 页 / 共 199 页
  12. 12. 第 2 章 正式开始 本章将带你完成第一步,获得 JBoss jBPM 并给出立即开始运行基本的指南。 2.1. 下载包概述 下面列出的是当前可用的不周的 jBPM 包。每个包都包含了一个或更多的可下载的文 件。连同这些文件还有其内容的描述,如果是可以安装的话还会有相关的安装手册。 下列被描述的所有的下载都可以在 Sourceforge jBPM 下载页面上找到。 2.1.1. jPDL 3 下载 jBPM jPDL 3 从 Sourceforge.net站点. 这是一个主发布包,它包含了核心引擎和许 多同jPDL一起工作可能会用到的的额外模块。 • jPDL 套件(bpm-jpdl-suite.zip):jPDL套件是一个扩展了的包含设计器和服务器的 运行时。所有的这些组件被预配置来进行交互操作。如果你想快速的开始jBPM,那 么这个就是你要下载的文件。它包含了这个包的所有其他的模块加上图形化的设计 器在一个单独的下载里。解压这个压缩包到你选择的目录,并阅读“readme.html” 这个文件来获得更多的信息和深入的安装指南。有了这个新手工具箱你就能快速的 开始 第 3 章 教程。 • jPDL 运行时引擎(jbpm-jpdl.zip):这个下包含了 jBPM 核心库、文档和依赖库,还 有为参与者和群组管理提供的身份组件。要让它工作,解压压缩包进入你选择的文 件夹。 你将经“jbpm-<version>” 文件夹下找到用户指导手册的提示以及 “readme.html” 文件中的其他重要的资源信息。 2.1.2. jPDL 流程设计器 jPDL套件包中包含jPDL流程设计器。你通常将下载它在jPDL套件包中。但是你也可以 从sourceforge.net站点单独下载JBoss jBPM 流程设计器。设计器是一个eclipse的插件,你可 以用它来创作流程定义并简便的部署这些流程。 插件可以以压缩的Eclipse功能包或者Eclipse 的更新站点两种方式进行下载, 它们在内容上没有什么不同, 唯一的区别就是你所采用的安 装方式的差异。 • Eclipse 更新站点(jbpm-gpd-site-<version>.zip):如果你想绝对确保设计器流畅地 安装, 我们建议你使用 站点更新机制和全新安装的 eclipse。 当然 Eclipse 的版本要 同下载包匹配。为了启动设计器插件,包含在包根目录下的“readme.html”文件 中的下列使用说明帮助你成功安装 GPD(图形流程设计器) 。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 12 页 / 共 199 页
  13. 13. • Eclipse 特性包(jbpm-gpd-feature-<version>.zip):如果你讨厌不得不每次都 刷新 Eclipse 的安装,并且你愿意去处理一些可能会发生的问题的话,你可以试着 下载它。在这种情况下释放这个包进入你的 Eclipse 的安装目录(确保你的 plugins 和 feature 目录在 Eclispe 安装的相同的位置) ,覆盖已经存在的相同的名称的目录 和文件。 这样的安装是非常的容易的, 但是当你可能会陷入兼容性问题因为你的覆 盖安装其他属性的安装文件时, 虽然他们有相同的文件名, 但也可能发生版本冲突 的 plugins 是完全相同的,以后可能会有不兼容的问题。安装说明在 readme.html” “ 文件中也还一份。 2.2. JBoss jBPM 项目目录 • 专业支持:JBoss 是这个项目背后的公司,公司提供专业的技术支持、培训 和顾问服务 • 用户手册: 你正在阅读的文档和项目的主要文档的入口 • 论坛: 取得与社区的联系,提出问题并且讨论jBPM • wiki: 额外的信息,大部分为社区提供 • 问题追踪:提交的bug和功能要求 • 下载: BPM 的sourceforge的下载页面 • 邮件列表: 用于公告发布邮件列表 • javadocs: 部分下载的 doc/javadoc 文档目录。 2.3. 访问源代码 CVS 服务器 2.3.1. 匿名 CVS 访问 作为候选,你可以使用下列信息从 CVS 服务器获得 JBoss jBPM 项目: • 连接类型: pserver • 用户名: anonymous • 主机:anoncvs.forge.jboss.com • 端口:2401 (缺省) • 库路径: /cvsroot/jbpm 2.3.2. 开发人员 CVS 访问 为了获得CVS的开发人员访问权限,你必须签署贡献者协议并有一个ssh 钥匙(key)。更 多的信息在JBoss cvs repository wiki 页面 上可以找到。 • 连接类型: ext over ssh (eclipse 里的 extssh) cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 13 页 / 共 199 页
  14. 14. • 用户名: sf.net 用户名或 jboss 用户名 • 主机:cvs.forge.jboss.com • 端口:2401 (缺省) • 库路径: /cvsroot/jbpm • 标签::pserver:anonymous@cvs.forge.jboss.com:/cvsroot/jbpm cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 14 页 / 共 199 页
  15. 15. 第 3 章 教程 本教程将向你展示使用 jpdl 构建基本流程及管理运行时执行的 API 的使用方法。 教程的方式是解释一系列的例子, 每个例子以特定的主题为焦点并包含大量的注释。这 些例子在 jBPM 下载包的 src/java.examples 目录中也能找到。 最好的学习方法就是创建一个项目并且在给定实例的基础上试着修改。 Eclipse 用户首先要做的是: 下载 jbpm-3.0-[version].zip 文件并解压到你的系统中。 然后 执行"File" --> "Import..." --> "Existing Project into Workspace",点击"Next"按钮,找到 jBPM 根目录点击"Finish"按钮。现在你的工作空间(workspace)中已经有一个 jbpm.3 的项目了。 现在就可以在 src/java.examples/ 文件夹下找到教程的例子,打开这些例子时,可以使用 "Run" --> "Run As..." --> "JUnit Test" 方式来运行它们。 jBPM包含一个图形化设计工具来创作例子中的XML文件。你可以找到下载说明在 2.1 下载包概述。你不需要这个图形化设计工具来完成本教程。 3.1. Hello World 实例 流程定义是一个定向图,由节点和流程转换组成。hello world 流程中有 3 个节点,来看 下如何将他们放在一起, 我们先不用流程设计工具来开始一个简单流程。 下面的图形显示了 hello world 流程的图示。 start s end 图 3-1 hello world 流程图 package org.zym.helloworld; cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 15 页 / 共 199 页
  16. 16. import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; import junit.framework.TestCase; public class HelloWorld extends TestCase { public void testHelloWorldProcess() { // 这个方法显示一个流程定义和一个流程定义的执行。流程定义有三个节点: // 未命名的start-state, state 's' 和 命名为 'end' 的 end-state 节点。 // 下一行解析 xml 文本到 ProcessDefinition 类, // ProcessDefinition 是作为java对象的的流程的正规描述 ProcessDefinition processDefinition = ProcessDefinition .parseXmlString("<process-definition>" + " <start-state>" +" <transition to='s' />" + " </start-state>" + " <state name='s'>" + " <transition to='end' />" + " </state>" + " <end-state name='end' />" + "</process-definition>"); // 下一行建立一个流程定义的执行,在创建后,流程执行有一个执行的主路径 // (=root token),定位在start-state节点位置。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 16 页 / 共 199 页
  17. 17. ProcessInstance processInstance = new ProcessInstance(processDefinition); // 创建流程执行的主路径 (=root token) Token token = processInstance.getRootToken(); // 在创建流程定义后,确定主路径牌开始状态节点处 assertSame(processDefinition.getStartState(), token.getNode()); // 让我们开始流程执行,通过它的缺省流程转换离开开始状态节点 token.signal(); // signal 方法将阻止直到流程执行进入一个等待状态 // 流程执行将已经进入了这第一个等待状态,状态 's' 节点。 // 所以执行的主路径现在定位在状态's' assertSame(processDefinition.getNode("s"), token.getNode()); // 让我们发送另一个信号。假设执行离开状态's'通过缺省的流程转换 token.signal(); // 现在信息方法返回,因为这个流程实例已经到达结束节点(end-state) assertSame(processDefinition.getNode("end"), token.getNode()); } cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 17 页 / 共 199 页
  18. 18. } 译者注:以上的代码是可执行的 Junit 测试用例程序,复制到 eclipse 中即可执行。与原文档的代码有所差 异。但主测试方法是完全一样的。 3.2. Database 实例 jBPM 的基本属性之一就是流程在等待状态时,能够将流程执行的状态在数据库中进行 持久化。下一个实例将向你显示如何在 jBPM 数据库中存储一个流程实例。 实例也暗示了可能遇到的上下文。独立的方法被用来创建用户代码的不同部分。例如: Web 应用中的一处代码开始流程并在数据库中持久化执行。后来,一个消息驱动 bean 从数 据库中加载流程实例并恢复它的执行。 更多的关于jBPM持久性的信息能在 第 7 章 持久性 中找到。 import java.util.List; import junit.framework.TestCase; import org.jbpm.JbpmConfiguration; import org.jbpm.JbpmContext; import org.jbpm.db.GraphSession; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; public class HelloWorldDbTest extends TestCase { cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 18 页 / 共 199 页
  19. 19. static JbpmConfiguration jbpmConfiguration = null; static { // 实例配置文件,例如此文件能够在 src/config.files 文件夹下找到。 // 正常的情况下此配置文件的信息是在 jbpm.cfg.xml 资源文件中, // 但这里我们放配置文件信息作为一个XML字符串 // 首先我们创建 JbpmConfiguration 静态变量。 // 一个 JbpmConfiguration 能够用于系统中的所有线程,那就是我们让它是static类型的原 因。 jbpmConfiguration = JbpmConfiguration.parseXmlString( "<jbpm-configuration>" + // jbpm-context 上下文机制把jBPM核心引擎和jbpm使用的服务从环境中分开 " <jbpm-context>" + " <service name='persistence' " + " factory='org.jbpm.persistence.db.DbPersistenceServiceFactory' />" + " </jbpm-context>" + // 而且 jbpm 所使用的资源文件都参考 jbpm.cfg.xml 文件 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 19 页 / 共 199 页
  20. 20. " <string name='resource.hibernate.cfg.xml' " + " value='hibernate.cfg.xml' />" + " <string name='resource.business.calendar' " + " value='org/jbpm/calendar/jbpm.business.calendar.properties' />" + " <string name='resource.default.modules' " + " value='org/jbpm/graph/def/jbpm.default.modules.properties' />" + " <string name='resource.converter' " + " value='org/jbpm/db/hibernate/jbpm.converter.properties' />" + " <string name='resource.action.types' " + " value='org/jbpm/graph/action/action.types.xml' />" + " <string name='resource.node.types' " + " value='org/jbpm/graph/node/node.types.xml' />" + " <string name='resource.varmapping' " + " value='org/jbpm/context/exe/jbpm.varmapping.xml' />" + "</jbpm-configuration>" ); } public void setUp() { jbpmConfiguration.createSchema(); } cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 20 页 / 共 199 页
  21. 21. public void tearDown() { jbpmConfiguration.dropSchema(); } public void testSimplePersistence() { // 下面这3个方法调用中,所有数据都是通过数据库传递的。 // 在这个单元测试里,因为我们想要测试一个完整的流程环境,所以这3个方法在交互后被 执行。 // 但实际上,这些方法代表了对服务器的不同的请求。 // 因为我们开始的是一个干净的、空的内存数据库,所以我们不得不先部署流程。 // 实际上,这个以前是由流程开发人员来完成的。 deployProcessDefinition(); // 假设我们想开始一个流程实例(=流程执行)当用户在web应用中提交一个表单时... processInstanceIsCreatedWhenUserSubmitsWebappForm(); // 然后,异步消息到来流程继续执行 theProcessInstanceContinuesWhenAnAsyncMessageIsReceived(); } public void deployProcessDefinition() { // 这个测试显示流程定义和一个流程定义的执行。流程有三个节点: cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 21 页 / 共 199 页
  22. 22. // 未命名的开始状态、状态's'和一个命名为'end'的结束状态 ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition name='hello world'>" + " <start-state>" + " <transition to='s' />" + " </start-state>" + " <state name='s'>" + " <transition to='end' />" + " </state>" + " <end-state name='end' />" + "</process-definition>" ); // 查找上面配置的pojo持久性上下文生成器 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { // 在数据库中部署流程定义 jbpmContext.deployProcessDefinition(processDefinition); } finally { // 拆毁 pojo 持久性上下文。 // 这里包含刷新SQL来插入流程定义到数据库 jbpmContext.close(); cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 22 页 / 共 199 页
  23. 23. } } public void processInstanceIsCreatedWhenUserSubmitsWebappForm() { // 在方法里的代码能够放在struts-ation或JSF管理bean中。 // 查找上面配置的pojo持久性上下文生成器 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { GraphSession graphSession = jbpmContext.getGraphSession(); ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world"); // 用从数据库中检索到的processDefinition, // 我们能创建一个像在hello world例子中那样的流程定义执行(那个例子是持久性的) ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); assertEquals("start", token.getNode().getName()); // 让我们开始流程执行 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 23 页 / 共 199 页
  24. 24. token.signal(); // 现在流程是在状态's'。 assertEquals("s", token.getNode().getName()); // 现在 processInstance 被存储在数据库中。所以流程执行的当前状态被存储在数据库中。 jbpmContext.save(processInstance); // 下面的方法将从数据库中取出流程实例,并通过提供的另一个外部信号恢复执行 } finally { // 拆毁pojo持久性上下文。 jbpmContext.close(); } } public void theProcessInstanceContinuesWhenAnAsyncMessageIsReceived() { // 方法里的代码能够成为消息驱动Bean的内容. // 查找上面配置的pojo持久性上下文生成器 JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(); try { GraphSession graphSession = jbpmContext.getGraphSession(); // 首先,我们必须得到数据库中取出的流程实例.有几个选项是我们要知道的 // 什么样的流程实例我们正在处理的.在这个简单测试用例是最容易的,因为只是查找流 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 24 页 / 共 199 页
  25. 25. 程实例的所有列表. // 那样就只给我们一个结果.所以让我们查看流程定义. ProcessDefinition processDefinition = graphSession.findLatestProcessDefinition("hello world"); // 我们搜索流程定义的所有流程实例 List processInstances = graphSession.findProcessInstances(processDefinition.getId()); // 因为我们知道这个单元测试的上下文里,只有一个执行。在实际的环境中, // processInstanceId 能够从到达的消息内容或用户所做的选择中进行提取。 ProcessInstance processInstance = (ProcessInstance) processInstances.get(0); // 现在我们继续执行,注意那个 processInstance 代理信号到达执行主路径(=root token)。 processInstance.signal(); // 在这个信号后,我们知道流程执行应该已到了结束状态 assertTrue(processInstance.hasEnded()); // 现在我们可以更新数据库中的执行状态 jbpmContext.save(processInstance); cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 25 页 / 共 199 页
  26. 26. } finally { // 拆毁pojo持久性上下文。 jbpmContext.close(); } } } 译者注:以上的代码是可执行的 Junit 测试用例程序,复制到 eclipse 中即可执行。与原文档的代码有所差 异。但主测试方法是完全一样的。 3.3. Context 实例:流程变量 流程变量包含流程执行期间的上下文信息。流程变量同 java.util.Map 类相似,映射变量 命名到值,这个值是 java 对象。流程变量作为流程实例的一部分被持久化。为了保持简单, 这个例子中我们只显示同变量一起工作的 API,而没有持久性。 更多关于变量的信息能够在 第 11 章 上下文 中找到。 import junit.framework.TestCase; import org.jbpm.context.exe.ContextInstance; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; public class TestProcessVarible extends TestCase { cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 26 页 / 共 199 页
  27. 27. public void testProcessVaribles(){ // 这个例子还是从hello world流程开始,这次甚至没有修改. ProcessDefinition processDefinition = ProcessDefinition.parseXmlString( "<process-definition>" + " <start-state>" + " <transition to='s' />" + " </start-state>" + " <state name='s'>" + " <transition to='end' />" + " </state>" + " <end-state name='end' />" + "</process-definition>" ); ProcessInstance processInstance = new ProcessInstance(processDefinition); // 从流程实例中取得同流程变量一起工作的上下文实例 ContextInstance contextInstance = processInstance.getContextInstance(); // 在流程已经离开开始状态之前,我们将在流程实例的上下文中设置一些变量. cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 27 页 / 共 199 页
  28. 28. contextInstance.setVariable("amount", new Integer(500)); contextInstance.setVariable("reason", "i met my deadline"); // 从现在开始,这些变量同流程实例关联在一起. // 流程变量现在可以通过显示的API被用户代码来访问. // 流程变量也可以作为流程实例的一部分存储到数据库中. processInstance.signal(); // 通过上下文实例是可以可以访问变量的 assertEquals(new Integer(500), contextInstance.getVariable("amount")); assertEquals("i met my deadline", contextInstance.getVariable("reason")); } } 3.4. Task 分配实例 下一实例中我们将显示你如何能够给用户分配任务。 因为工作流引擎和组织结构模型是 分 开 的 , 这样 用 来 计 算参 与 者 的 表达 式 语 言 总是 会 受 到 限制 。 所 以 ,你 不 得 不 指定 AssignmentHandler 的实现来计算任务的参与者。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 28 页 / 共 199 页
  29. 29. package org.zym; import junit.framework.TestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.graph.exe.Token; import org.jbpm.taskmgmt.exe.TaskInstance; public class TaskAssignmentTest extends TestCase { public void testTaskAssignment() { // 下面显示的流程基于hello world流程的.状态节点被任务节点替换. // 任务节点在JPDL中代表在流程继续执行前的等待状态和生成将要完成的任务的一 个节点 ProcessDefinition processDefinition = ProcessDefinition .parseXmlString("<process-definition name='the baby process'>" + " <start-state>" +" <transition name='baby cries' to='t' />" + " </start-state>" + " <task-node name='t'>" +" <task name='change nappy'>" +" <assignment cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 29 页 / 共 199 页
  30. 30. class='org.jbpm.tutorial.taskmgmt.NappyAssignmentHandler' />" +" </task>" + " <transition to='end' />" + " </task-node>" + " <end-state name='end' />" + "</process-definition>"); // 建立一个流程定义的执行 ProcessInstance processInstance = new ProcessInstance(processDefinition); Token token = processInstance.getRootToken(); // 让我们开始流程执行,通过缺省的流程转换离开开始状态(start-state) token.signal(); // 信号将阻塞流程执行,并进入等待状态,在本例中,也就是任务节点(task-node). assertSame(processDefinition.getNode("t"), token.getNode()); // 当流程执行到任务节点时,任务"换尿布"被创建了,并且 NappyAssignmentHandler 被 调用 // 来检查任务应该分配给谁. NappyAssignmentHandler 返回 'papa'. // 在真实的环境中,任务将由 org.jbpm.db.TaskMgmtSession 类中的方法从数据库中被 捕获. // 因为我们不想将持久化的复杂性引入此例,我们只是处理流程实例的第一个任务实例 // (我们知道在测试环境中也只有一个) TaskInstance taskInstance = (TaskInstance) processInstance .getTaskMgmtInstance().getTaskInstances().iterator().next(); cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 30 页 / 共 199 页
  31. 31. // 现在我们检查任务实例是否真正的赋给了 'papa'. assertEquals("papa", taskInstance.getActorId()); // 现在我们假设爸爸已经完成了任务并标记任务完成了 taskInstance.end(); // 由于这是上一个任务要做的,任务触发继续流程实例执行. assertSame(processDefinition.getNode("end"), token.getNode()); } } 译者增加* 由于此处使用了自定义的参与者赋值处理类,此类可以在根目录的 examples 下找到,此例的源代码如下: package org.jbpm.tutorial.taskmgmt; import org.jbpm.graph.exe.*; import org.jbpm.taskmgmt.def.*; import org.jbpm.taskmgmt.exe.Assignable; public class NappyAssignmentHandler implements AssignmentHandler { private static final long serialVersionUID = 1L; cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 31 页 / 共 199 页
  32. 32. public void assign(Assignable assignable, ExecutionContext executionContext) { assignable.setActorId("papa"); } } 3.5. 自定义动作实例 动作(Action)是绑定自定义的 java 代码到 jbpm 流程的一个机制。动作可以用它自己 的节点进行关联(假设他们在流程的图示中是相关的) 。或者动作要可以放在事件(event) 上,例如:流程转换、离开节点或进入节点,如果那样的话,动作不会是图示的一部分,但 在运行时流程执行击发事件执行时也会执行。 我们来看下我们例子中的动作的实现:MyActionHandler。这个动作实现程序并没有真 正的做什么实际的事…,它只是设置了 isExecuted 这个布尔变量的值为真(true) 。变量 isExecuted 是静态的,以至于能够在动作处理内部访问,同时来校验它的值。 更多的关于动作的信息可以在 10.5 动作 节中找到。 package org.zym; import org.jbpm.graph.def.ActionHandler; import org.jbpm.graph.exe.ExecutionContext; // MyActionHandler 代表一个在流程执行期间被用户代码执行的类 public class MyActionHandler implements ActionHandler { // 测试每个测试开始前,设置 isExecuted 值为 false public static boolean isExecuted = false; cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 32 页 / 共 199 页
  33. 33. // 动作设置 isExecuted 值为 true,以至于当动作正在被执行时单元测试中能够显示 public void execute(ExecutionContext executionContext) throws Exception { isExecuted = true; } } 前面提到过,在每个测试开始前,我们将设置静态属性 MyActionHandler.isExecuted 的 值为假(fasle)。 // 每个测试将要开始时会设置 MyActionHandler 的静态成员 isExecuted 的值为 false public void setUp() { MyActionHandler.isExecuted = false; } 我们将在转换中开始一个动作。 package org.zym; import junit.framework.TestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.tutorial.action.MyActionHandler; public class TransitionActionTest extends TestCase { cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 33 页 / 共 199 页
  34. 34. // 每个测试将要开始时会设置 MyActionHandler 的静态成员 isExecuted 的值为 false public void setUp() { MyActionHandler.isExecuted = false; } public void testTransitionAction() { // 下一个流程是hello world流程的一个变体. // 我们在状态's'到结束状态的转换上增加了一个动作. // 这个测试的目的是展示下在 jBPM 流程中集成 java 代码时多么的容易 ProcessDefinition processDefinition = ProcessDefinition .parseXmlString("<process-definition>" + "<start-state>" + "<transition to='s' />" + "</start-state>" + "<state name='s'>" + "<transition to='end'>" + "<action class='org.jbpm.tutorial.action.MyActionHandler' />" + "</transition>" + "</state>" + "<end-state name='end' />" + "</process-definition>"); // 开始一个新的流程定义的执行. cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 34 页 / 共 199 页
  35. 35. ProcessInstance processInstance = new ProcessInstance(processDefinition); // 下一个信号将导致执行离开开始状态并进入状态's'. processInstance.signal(); // 此处显示 MyActionHandler 还没有被执行 assertFalse(MyActionHandler.isExecuted); // 而且执行的主路径被定位在状态 's' 处 assertSame(processDefinition.getNode("s"), processInstance .getRootToken().getNode()); // 下一个信号将触发根令牌执行,令牌携动作执行流程转换,而且在调用信号方法时 将执行动作 processInstance.signal(); // 此处我们可以看到在调用信号方法时 MyActionHandler 被执行了 assertTrue(MyActionHandler.isExecuted); } } 下个例子显示了相同的动作,但现在这个动作分别被放在了进入节点和离开节点事件 中。注意这个节点同转换相比已经有了更多的事件类型,而那个只有一个事件。因此置于一 个节点上的动作应该放在一个事件元素上。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 35 页 / 共 199 页
  36. 36. package org.zym; import junit.framework.TestCase; import org.jbpm.graph.def.ProcessDefinition; import org.jbpm.graph.exe.ProcessInstance; import org.jbpm.tutorial.action.MyActionHandler; public class NodeEventActionTest extends TestCase { // 每个测试将要开始时会设置 MyActionHandler 的静态成员 isExecuted 的值为 false public void setUp() { MyActionHandler.isExecuted = false; } public void testNodeEventAction() { ProcessDefinition processDefinition = ProcessDefinition .parseXmlString("<process-definition>" + " <start-state>" +" <transition to='s' />" + " </start-state>" + " <state name='s'>" +" <event type='node-enter'>" cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 36 页 / 共 199 页
  37. 37. +" <action class='org.jbpm.tutorial.action.MyActionHandler' />" +" </event>" +" <event type='node-leave'>" +" <action class='org.jbpm.tutorial.action.MyActionHandler' />" +" </event>" + " <transition to='end'/>" + " </state>" + " <end-state name='end' />" + "</process-definition>"); ProcessInstance processInstance = new ProcessInstance(processDefinition); assertFalse(MyActionHandler.isExecuted); // 下一个信号将导致流程执行离开开始状态并进入状态's'. // 以至于进入状态's',此后开始执行动作 processInstance.signal(); assertTrue(MyActionHandler.isExecuted); // 重置 MyActionHandler.isExecuted MyActionHandler.isExecuted = false; // 下一个信号将触发流程执行,离开状态's',所以这个动作将再次被执行 processInstance.signal(); // 瞧 :~ assertTrue(MyActionHandler.isExecuted); cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 37 页 / 共 199 页
  38. 38. } } cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 38 页 / 共 199 页
  39. 39. 第 4 章 面向图的程序设计 4.1. 介绍 本章可以给出 JBoss jBPM 的明细单,完整的愿景概览、当前战略下的理念以及 JBoss jBPM 项目未来的方向。这一愿景和传统的取向相比有极大的不同。 首先,我们相信复合流程(multiple process)语言。不同环境和不同目的要求他们自己 特定的流程语言。 其次,面向图形的程序设计是一个新的技术实现,这种技术实现是针对所有基于图的流 程语言的基础。 这样做的最主要的好处就是它定义了一种针对所有类型的流程语言基础技术。 当今的软件开发越来越多的依赖领域特定语言。一个典型的 java 开发人员将使用相当 多的领域特定语言。项目中的 XML 文件作为各种框架的输入就可以认为是领域特定语言。 领域特定语言 Java Ruby … jPDL BPEL PageFlow … IoC-configs Hibernate 面向图的程序设计 Mappings 程序设计语言 基于图的语言 …… 图 4-1 基于图的语言的定位 工作流、BPM、orchestration 和 pageflow 的领域特定语言是基于定向图执行之上的。 其他的像 hibernate 的映射文件、ioc-configuration 则不是这样的。面向图的程序设计是基于 执行图的领域特定语言的基础。 面向图的程序设计语言是非常简单的技术,它描述了如何定义图和被执行在纯 OO 程序 设计语言上。 在4.5 应用领域,我们将涉及大多数的常用的流程语言,这些语言都是可以使用面向图 的程序设计方法来实现的,如工作流、BPM、编排(orchestration)和pageflow。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 39 页 / 共 199 页
  40. 40. 4.1.1. 域特定语言 每一流程语言都能被认为是一个领域特定语言(Domain Specific Language ,DSL)。DSL 透视图让开发人员能很好的理解流程语言和纯 OO 程序设计如何关联的。 本节也许会留下我们单纯地专注在以程序设计环境为中心的印象。 这是千真万确的。 面 向图的程序设计包含了从 API 库到完全成熟的 BPM 成套产品的整个 BPM 产品线。这套 Bpm 产品是完整的软件开发环境,这个环境是以业务流程为中心的。在那种类型的产品中,在程 序语言中的编码被尽可能的避免了。 一个重要的领域特定语言的方面就是每一种语言都有某种语法。那种语法能够被表述为 一个领域模型。 假如是 java 的话,这就是类、方法、域和构造器等等,而对于 jPDL 就是节点、转换和 动作等等,而对于规则(rules),这就是条件和结果等等。 DSL 的主旨就是开发人员当使用特定的语言创作为工件时可以考虑那些语法。IDE 工 具建立语言语法。然后,不同的编辑器就能创作工件。例如:jPDL 流程有一个图形编辑器 和一个 XML 源代码查看编辑器。而且有不同的方法来存储相同的工件:对于 jPDL 来说, 这可能是一个流程 XML 文件或序列化了的节点和转换的对象图。 另一个(理论上的)例子是 java:你可以在系统上使用 java 类文件格式。当用户启动 编辑器时,源文件就被生成了。当用户保存时这个编译过的类也就被保存了… 10 年前,开发人员最大部分的精力花在写代码上了。现在一个转换已经取代了这个位 置,他们而是去学习和使用领域特定语言。 这种趋势仍将继续而且导致的结果就是开发人员 将在框架和在主机平台上开发软件之间有了更大的选择。JBoss SEAM 正走向那个方向。 那些语言中的一些是基于图执行之上的。例如:java 的工作流 jPDL、服务编排的 BPEL 和 SEAM pageflow 等等,对于所有这些类型的领域特定语言,面向图的程序设计是一个通 用基础。 将来,对于每一个语言、开发人员能够选择一个适合自己的最好的编辑器。例如:重量 级的程序员可能更喜欢以源文件格式编辑 java,因为那样工作真的很快。但是缺少经验的 java 开发人员可能会选择一个通过点击编辑器就能编写一个功功能性的 java 类。Java 源编 辑将更加灵活。 查看这些领域特定语言(包括程序设计语言)的另一种方式是从结构化软件透视图。面 向对象的程序设计(OOP)使用数据通过分组设计方法增加结构。面向切面程序设计(AOP) 增加一个方法结构通过分组方法去提取关注的交叉切面。依赖注入(DI)和反转控制(IoC) 框架增加简易的对象图配线。 而且通过结构化图执行周围的软件项目的一部分,基于执行语 言的图(这提及的)是能有帮助的去处理复杂性的事务。 一个在领域特定语言(DSL)的基本解释能够在Martin Fowler的博客(bliki)上找到。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 40 页 / 共 199 页
  41. 41. 但它之后的愿景在Martin的关于《Language Workbenches》的文章中有更加详细的说明。 4.1.2. 基于图的语言的属性 有为数众多的基于图的流程语言。在环境和焦点里有很大的不同。举例来讲,BPEL 作 为一个 XML 被计划,这个 XML 是基于在企业服务总线(Enterprise Service Bus ,ESB)架构 之上的服务编排组件的。并且 pageflow 流程语言可以解释 web 应用的页面是如何能够被导 航的。这些是两种完全不同的环境。 尽管有这些不同,你也会发现在几乎每一个流程语言里有两个特征:等待状态支持 (support for wait states)和图示(graphical representation)。这不是偶然的因为这两种特征在 纯粹的面向对象程序设计语言(如 java)中没有被充分的支持。 面向图的程序设计是一种用面向对象程序设计语言去实现的技术。 面向图的程序设计对 OOP 的依赖意味着实现于面向图的程序设计的所有具体流程语言将使用 OOP 来开发。 但是 这不是说流程语言本身暴露出了这种 OOP 的任何特性。例如:BPEL 和 OO 程序设计没有 任何关系并且它可以在面向图的程序设计上被实现。 4.1.2.1. 等待状态支持 命令式的程序设计语言(如 java)常被用来表示一个系统中被执行的顺序指令。没有等 待指令。命令式的语言描述起来是完美的,例如一个服务器的请求响应周期。系统将连续执 行顺序指令直到请求被处理并且完成响应。 但一个这样的请求是较大的场景典型代表。例如:客户端提交一个采购订单,这一订单 将被采购经理验证。在审批后,这一信息必须录入到 ERP 系统中去。大量的对服务器的请 求是相同的大场景的部分。 所以流程语言是描述较大场景的语言。一个非常重要的区别是我们必须认为这是一个系 统(编排)上是可执行的场景,而且场景也是在多系统(安排)间可以描述协议的。 基于图的程序设计实现技术只是瞄准可以在机器(编排机)上执行的流程语言。 所以一个编排流程根据一个系统描述整个场景.例如:当客户端提交一个订单时开始流 程。流程的下一步是订单经理审批。 所以系统必须在订单经理的任务列表中增加一个入口点 和一个等待(状态)直到订单经理处理这个请求的输入。 当这个输入接收后,流程继续执行。 现在一个消息送达到 ERP 中流程处理待状态直到响应消息返回。 所以为一个系统描述整个场景,我们需要一个应付等待状态的机制。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 41 页 / 共 199 页
  42. 42. 在大多数的应用领域, 执行必须在等待状态时被持久化。 那也就是为什么只阻塞线程是 不足够的原因。聪明的 Java 程序员也许会考虑 Object.wait()和 Object.notify()方法。那种处理 用于模拟等待状态还可以,但问题是线程是不可被持久化的。 连续(Continuations)是使线程(和上下文变量)可持久化的技术。这个也许是足够 解决等待状态问题的了。而且我们也将在下一节讨论,图示在许多应用领域也是重要的。而 且连续(Continuations)是一个基于命令式程序设计的技术,所以它是不适合的对于图形 表示。 所以支持等待状态的一个重要的方面就是执行需要是可持久化的。 不同的应用领域也许 有不同的需求来持久化这样一个执行。对于大多数工作流,BPM 和编排应用,执行需要在 关系数据库中持久化。代表性的是,一个流程执行中的状态转换将和数据库中的一个转换进 行通信。 4.1.2.2. 图形化表示 软件开发的某些方面得益于基于图的途径是非常好的。 业务流程管理是基于图的语言的 应用领域中的最明显的一个。在那个例子中,在业务分析和开发人员间的通讯是被改进的用 基于图的业务流程图解像通用语言那样。参考4.5.1 业务流程管理(BPM)节 另一方面能够从图示中得益的是页面流(pageflow)。假若那样的话,在图示里页面、 导航和动作命令是被显示和链接在一起的。 在面向图的程序设计里,我们瞄准表示一些执行的表单的图表。那是和诸如 UML 类图 有明显的区别的,这种 UML 类图表示一个 OO 数据结构的静态模型。 此外图形表示可以被看作在 OO 程序设计中错过的特性。 而且也没有什么明智的方法能 够以图形化的表示 OO 程序的执行。所以在 OO 程序和图形视图间没有什么直接关系。 面向图程序设计,是以图为中心并且是一个的真正的软件制品,如描述流程图的 XML 文件。因为图形视图是软件的固有部分,它总是同步的。无须将一个图形需求插翻译成软件 设计。软件是以图进行组织的。 4.2. 面向图的程序设计 这里我们展示的是一个基于图的执行语言的实现技术。这里展示的技术是基于与图集成 的运行时的,其他的图执行技术都是基于消息队列或代码生成的。 本节会解释这个策略如何在 OO 程序设计语言上实现图执行。那些同设计模型是相似 的,它是命令模式(command pattern)和责任链模式(chain of responsibility pattern)的结合 体 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 42 页 / 共 199 页
  43. 43. 我们将用最简单的可能模型来开始并一点点的扩展它。 4.2.1. 图结构 首先,图的结构是用节点(Node)和转换(Transition)类来表示的。一个转换有一个 方向,因此节点具有了离开和到达转换(的事件) 。 离开转换 转换 节点 目标 图 4-2 节点和转换类 4.2.2. 执行 执行(execution)模型在图结构上定义,它看起来像一个有限状态机或 UML 状态图。 实际上面向图程序设计能够用来实现那些各类的行为,但是也可以做更多的事。 一个执行(也叫令牌[token])用一个叫做 Execution 的类来表示。一个执行有一个一当 前节点的引用。 节点 执行 节点 图 4-3 执行(Execution)类 转换能够用方法 take 从源节点到目标节点通过执行。 执行 +take(in Exection e) : void 图 4-4 转换(Transition)的 take 方法 当一个执行到达节点时,那个节点被执行。这个节点执行方法来负责传播这个执行。传 播执行意味着能够传递执行到节点,也就是通过它的离开转换到下一个节点。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 43 页 / 共 199 页
  44. 44. 节点 +execute(in Execution e) : void 图 4-5 节点(Node)的 execute 方法 当一个节点的 execute 方法不能传播执行时,它表现为一个等待状态。而且当一个新的 执行被创建时,它被初始为一个开始节点并且等待一个事件。 事件(event)被赋给一个执行而且它有触发执行开始移动。如果事件赋给与当前节点 相关的离开转换的话, 执行将处理那个转换。执行然后将继续传播直到它进入另一个具有等 待行为的节点。 执行 +event(in Event e) : void 图 4-6 执行的 event 方法 4.2.3. 流程语言 所以现在我们能够看到已经支持了两个主要的特性:等待状态和图形化表示。 在等待状态期间,执行只是指向图中的一个节点。流程图和执行都能被持久化。例如: 使用 O/R 映射工具存到一个关系数据库中或者是序列化图存成一个文件。 此外你可以看到那个节点和转换形成图并且以后是直接和一个图示结合的。 流程语言无非是一系列节点实现。每个节点实现和流程构图(constructs)进行通信。 流程构图的需要的行为通过覆盖 execute 方法来实现。 这里显示一个有 4 个构图的流程语言的例子:一个开始状态、一个条件、一个任务和一 个结束状态。这个例子没有关联 jPDL 流程语言。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 44 页 / 共 199 页
  45. 45. Node +execute() : void StartState Decision Task EndState +execute() +execute() +execute() +execute() 流程语言示例 图 4-6 流程语言示例 具体的节点对象现在可以用来建立流程图在我们流程语言示例中。 销售:开始状态 条件(amount>5K) 是 否 仔细检查:任务 交付:任务 结束:结束状态 图 4-8 流程示例 当创建一个流程的新的执行时,我们开始定位这个执行在开始节点。因此只要执行不接 收到一个事件,这个执行就将一直定位在开始状态。 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 45 页 / 共 199 页
  46. 46. 开始销售:开始状态 e:Execution 条件(amount>5K) 是 否 图 4-9 新执行 现在让我们看下当一个事件到达时会发生什么。在最初状态下,我们击发缺省的事件将 和缺少的转换进行通信。 也就是在执行对象上调用事件方法。 这个事件方法将传播找到缺少的离开转换并传递执 行通过转换,调用转换的 take 方法并将其自己作为一个参数进行传递。 这个转换将传递执行到决策节点并调用 execute 方法。让我们假设这个决策的 execute 方法发送了“是”这个事件到执行上。那将导致这个执行继续通过“是”转换并且执行将到 达任务节点——“仔细检查”。 让我们假设执行“仔细检查”任务节点的实现加一个入口刊检查员的任务列表,然后等 待检查员输入而不会进一步传播执行。 现在,执行将一直定位在“极细检查”任务节点。所有的嵌套调用将开始运行直到那个 最初的事件方法返回。 e:Execution 条件(amount>5K) 是 否 仔细检查:任务 交付:任务 图 4-10 在“仔细检查”等待状态的执行 4.2.4. 动作 在一些应用领域一定有一种方法来包含程序设计逻辑的执行,而不用为它引入节点。在 cncsi hlj brnc jeffming@126.com http://zhangym.javaeye.com/ 第 46 页 / 共 199 页

×