jBPM Starters Kit UserGuide

本文档详尽介绍了jBPM工作流引擎的各项功能,包括安装部署、配置使用、流程定义、任务管理等核心模块,并提供了丰富的示例代码帮助读者快速上手。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

jBPM Starters Kit UserGuide
1.   Introduction
介绍了jBPM 的功能,以及主要的组件。
2.    Getting Started
介绍了如何下载jBPM。
3.   Tutorial
介绍了如何利用Eclipse导入Starters Kit 自带的例子项目,并介绍了其中的Hello World Example。
 
·        testHelloWorldProcess() 为一个测试用例,用于测试流程运行是否正常;
·        public class HelloWorldDbTest extends TestCase 为数据库的测试用例类;
·        Context Example 为一个测试用例,测试流程中加入了变量的赋值;
·        Task assignment example 为一个测试用例,测试流程中加入了任务指派,即该任务由谁来完成。
·        Custom action example 为一个测试用例,为流程中的节点(Node)加入了Action,并观察该Action是否顺利地自动触发。
4.   Graph Oriented Programming
       1.采用 Domain Specific Language 来表示领域的业务流程,提高了抽象性,与特定的实现语言无关。jBPM采用面向图像编程语言作为领域分析师和开发者之间的交流方式。
      
       2.接着介绍了jPDL(jbpm Process Definition Language)的面向图形编程的结构,说明了表示符号和OO实现类的对应。
      Node包含一个execute(execution e)方法,用于执行到下一个Node节点,或者进入等待状态。要扩展节点,就直接继承该类,目前有诸如Start State Node、End State Node 、Decision Node和Task Node 、Fork Node等。
      Transition包含一个take(execution e)方法,用于传输执行流程
      Execution包含一个event(String event)方法,用于流程触发,当一个事件到来时,则触发这个执行流程执行到下一个Node节点。
     Actions包含一个execute()方法,由Enter Node或者Leave Node事件触发。
       3.然后以一个例子来具体介绍最基本的jDSL编程,源码工程在“C:/Leesen/Study/JBPM/ISMP Principle Source Code”。
       4.再接着再以一个例子来介绍高级jDSL编程,加入了变量(流程中的一些数据,比如申请保险单要填金额等信息;其作用域由Scoping Rules定义)、并行执行(Fork Node?)、合并执行(Join Node)等特征。
 
       5.最后介绍了一下BMP(Business Management Proccess) 的 Application Domain。
5.   Deployment
                 介绍了要在自己程序中部署使用jBPM 3 需要的环境。
                 1.需要的jBPM库:jbpm-[version].jar 和jbpm-identity-[version].jar(可   
                       选)
                 2.需要 J2SE 1.4.2 +
                 3.需要的第三方库:commons-logging.jar 和dom4j-1.6.1.jar,还有一些 
                        可选库。
              
6.   Configuration
               介绍了如何配置jBPM。
               1. 通过jbpm.cfg.xml文件对jBPM配置,并将该文件放在classpath根目     
                      录下。缺省的配置文件位于jBPM库中,org/jbpm/default.jbpm.cfg.xml
               2. 配置文件对应的Java类为org.jbpm.JbpmConfiguration,上下文等。
static JbpmConfinguration jbpmConfiguration = JbpmConfinguration.getInstance();
 
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext(String name);
try {
 // This is what we call a context block.
 // Here you can perform workflow operations
 
} finally {
 jbpmContext.close();
}
               3.再简单介绍了jBPM配置文件的标签含义。
               4.接着介绍了各种可自定义配置文件的含义和位置,例如 
                     hibernate.cfg.xml 、 node.types.xml等
               5.最后介绍了对象工厂,通过配置文件创建对象。                        
7.   Persistence
1.介绍了jBPM Persistence的API,通过context 调用,在jbpm.cfg.xml中的<jbpm-context/>标签中定义。
2.如何配置一个流程定义,一般由图形化界面完成,对应语句为
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
 ProcessDefinition processDefinition = ...;
 jbpmContext.deployProcessDefinition(processDefinition);
} finally {
 jbpmContext.close();
}
3.如何创建一个新的流程
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
 String processName = ...;
 ProcessInstance processInstance =
     jbpmContext.newProcessInstance(processName);
} finally {
 jbpmContext.close();
}
 
4.如何继续一个旧的流程,从数据库中load相关数据
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
 long processInstanceId = ...;
 ProcessInstance processInstance =
     jbpmContext.loadProcessInstance(processInstanceId);
 processInstance.signal();
 jbpmContext.save(processInstance);
} finally {
 jbpmContext.close();
}
       
           5.介绍了jBPM如何利用Hibernate来处理数据的持久化。图7.2表达个这   
 种结构,jbpmConfiguration根据配置文件定义维护了一个全局唯一的对象工厂,其中包含DbPersistenceServiceFactory和Hibernate SessionFactory,而每个线程有一个jbpmContext,他包含了一个DbPersistenceService实例和对应的Hibernate Session实例。
           6.jBPM 通过jbpmContext类exposed xxxSession classes,用来提供一系列服务,例如GraphSession、SchedulerSession、LoggingSession等
  
            7.介绍了如何配置持久化服务。 DbPersistenceServiceFactory会利用classpath根目录下的hibernate.cfg.xml(该名称可由'jbpm.hibernate.cfg.xml’配置文件中的<string name='resource.hibernate.cfg.xml' value='hibernate.cfg.xml' />项来指定)来创建hibernate SessionFactory。
                  通过<service name="persistence"> 来定义Persistence服务的一些参数,比如isTransactionEnabled、sessionFactoryJndiName等。
             8.jBPM缺省开启数据库事务,在jbpmContext.close()方法自动commit Transaction。
 
         9.如果不采用配置文件中缺省的配置,则可以通过jbpmContext插入新的资源。例如要插入用户自己创建的一个数据库连接,则可以
JbpmContext jbpmContext = jbpmConfiguration.createJbpmContext();
try {
 Connection connection = ...;
 jbpmContext.setConnection(connection);
 
 // invoke one or more persistence operations
 
} finally {
 jbpmContext.close();
}
                
           插入其它用户自定义的资源:
JbpmContext.setConnection(Connection);
JbpmContext.setSession(Session);
JbpmContext.setSessionFactory(SessionFactory);
 
 
    10.如何为jBPM配置一个新的数据库,步骤如下
put the jdbc-driver library archive in the classpath
update the hibernate configuration used by jBPM
create the schema in the new database (jbpmConfiguration.createSchema() and jbpmConfiguration.dropSchema())
  
          在jbdm.db项目中,有一系列数据库的驱动library,
     11.自定义Hibernate Mapping File
 
8.   The JBPM Database
1.介绍了如何利用PostgreSQL 来配置JBPM的后端数据库。
 创建jBPM表的script文件在jbpm-db/build中对应的数据库目录中,运行这些script则可以创建对应的初始化表
 
2.
9.   Process Modeling
1.流程定义采用XML格式(一般为processdefinition.xml),流程定义有向图包括Nodes和Transitions。一个流程实例就是流程定义的执行,一个token就是流程的执行路径,在流程创建初始,token指向流程定义的Start State。 一个Signal则通知token继续执行流程。当token进入一个Node时,该Node的execute方法被自动调用。Action为自定义的Java代码,由进入或离开Node等事件触发执行。
 
2.Nodes
      两个责任:一可以执行特定的task,比如更新数据库等;二可以propagate process execution,比如wait status node不传播执行,而fork Node产生新token,开始新流程执行路径。
     系统预定义的Nodes类型有:State,Task, Fork,Wait,Decision,Join
     用户可以根据自己的需要继承Nodes,实现自己的Node Type
3.Transition
     每个Transition都有1个Source Node和一个Destination Node
4.Actions、Event
 
GraphElement.fireEvent(String eventType, ExecutionContext executionContext);触发自定义的Event
 
5. SuperState
     由多个Node组成的组,
6.Exception Handling
      JBPM的流程不受Exception的影响,分为caught和uncaught,caught是由预先定义的Exception-Handle;uncaught则将Exception传递给Client(即发出token.signal()的调用端)
 
7.Process Compositon
      由Process State 表示,当流程到达时,它会产生一个新的子流程(Process),等待该子流程执行到End State时,该Process State才继续执行下去。
 <process-definition name="hire">
 <start-state>
    <transition to="initial interview" />
 </start-state>
 <process-state name="initial interview">
    <sub-process name="interview" />
    <variable name="a" access="read,write" mapped-name="aa" />
    <variable name="b" access="read" mapped-name="bb" />
    <transition to="..." />
 </process-state>
 ...
</process-definition>
 
 
           8.自定义业务逻辑代码
public class AmountUpdate implements ActionHandler {
 public void execute(ExecutionContext ctx) throws Exception {
    // business logic
    Float erpAmount = ...get amount from erp-system...;
    Float processAmount = (Float) ctx.getContextInstance().getVariable("amount");
    float result = erpAmount.floatValue() + processAmount.floatValue();
    ...update erp-system with the result...;
   
    // graph execution propagation
    if (result > 5000) {
      ctx.leaveNode(ctx, "big amounts");
    } else {
      ctx.leaveNode(ctx, "small amounts");
    }
 }
}
 
            9.流程的执行
            原则:在创建Process Instance时开始执行流程直到进入一个 wait state。
调用Token.Signal(Transition)就等于顺序调用了以下函数:
Token.signal(Transition)
--> Node.leave(ExecutionContext,Transition)
--> Transition.take(ExecutionContext)
--> Node.enter(ExecutionContext)
--> Node.execute(ExecutionContext)
 
 
10.                     Context
 
                介绍了流程执行过程中的变量用法。
                 1.设置和访问变量的接口
ProcessInstance processInstance = ...;
ContextInstance contextInstance = (ContextInstance) processInstance.getInstance(ContextInstance.class);
 
void ContextInstance.setVariable(String variableName, Object value);
void ContextInstance.setVariable(String variableName, Object value, Token token);
Object ContextInstance.getVariable(String variableName);
Object ContextInstance.getVariable(String variableName, Token token);
ContextInstance.deleteVariable(String variableName);
ContextInstance.deleteVariable(String variableName, Token token);
 
                2.当Process Save或者Update时,变量自动存入数据库中
                3.变量的缺省作用域是Process-Scope,如果要指定为Token-Scope,需要用到下面语句
ContextInstance.createVariable(String name, Object value, Token token);
 
 
                 4.Transient Variable,不必和某个Token关联
Object ContextInstance.getTransientVariable(String name);
void ContextInstance.setTransientVariable(String name, Object value);
 
 
                 5.自定义变量的持久化,自定义转换函数,自定义类型。
 
 
11.                     Task Management
                 1.Task一般在Task Node中定义,当Actors完成了该Task Node中定义的所有Tasks,则流程继续。
                 2.一个Task可以被分配给一个ActorId(java.lang.String),所有的Task Instance都存储在表JBPM_TASKINSTANCE中。
                  3.定义了TaskNode的执行规则,缺省情况下,当一个TaskNoded 的所有Tasks都执行完毕,流程才继续下去。
                  4.将一个Task分配给一个Actor:Assignable.setActorId(String actorId)
                  5.查找某个Actor的TaskList:TaskMgmtSession.findTaskInstances(String actorId)
                  6.Task Controller 是Process Varaibles和User Interface之间的桥梁,负责转换Process Variable和Task Variable。 Task Controller 从Process中获得Variable,创建Task Variable,通过User Interface(比如Web 、Application Form)更新Variable,并在Task Instance结束的时候,更新Process Variable。
                   7.通过Process Definition来实现Task Variable
 
<task name="clean ceiling">
 <controller>
    <variable name="a" access="read" mapped-name="x" />
    <variable name="b" access="read,write,required" mapped-name="y" />
    <variable name="c" access="read,write" />
 </controller>
</task>
 
                 8.自定义Controller来完成Variable的转换
public interface TaskControllerHandler extends Serializable {
 void initializeTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
 void submitTaskVariables(TaskInstance taskInstance, ContextInstance contextInstance, Token token);
}
 
                9.Swimlanes 是Process Role,负责一系列的Task ,当一个Actor被分配到一个Swimlanes,该Actor则可以负责这一系列的Task。当分配给Swimlanes的第一个Task Instance创建时,调用AssignmentHandle。
 
                10.有四种类型的Task Event :task-create,task-assign,task-start(TaskInstance.start())和task-end(TaskInstance.end()).
                11.自定义Task Instance:
                12.身份标识组件,可方便地被替换为公司现有的身份标识组件。分配的语法如下:
first-term --> next-term --> next-term --> ... --> next-term
 
where
 
first-term ::= previous |
               swimlane(swimlane-name) |
               variable(variable-name) |
               user(user-name) |
               group(group-name)
 
and
 
next-term ::= group(group-type) |
              member(role-name)
            
               如果要使用已有的用户身份标识数据库的话,则可以修改hibernate.cfg.xml配置文件的以下部分:
<mapping resource="org/jbpm/identity/User.hbm.xml"/>
<mapping resource="org/jbpm/identity/Group.hbm.xml"/>
<mapping resource="org/jbpm/identity/Membership.hbm.xml"/>
 
 
12.                     Scheduler
               1.当一个Timer expired时,一个Action可以execute,一个Transition可以taken。
               2.如何为Node定义一个Timer:
<state name='catch crooks'>
 <timer name='reminder'
         duedate='3 business hours'
         repeat='10 business minutes'
         transition='time-out-transition' >
    <action class='the-remainder-action-class-name' />
 </timer>
</state>
 
             3.当一个Timer被执行时,会触发下列事件:
                    该Timer类型的事件;如果有定义action,则action被执行;如果有定义transition,则signal会发出,使流程继续。
 
 
13.                     Asynchronous continuation
                  1.异步执行即是,主线程不必等待子线程执行完毕就直接返回。
                   2.一个Node可以通过设置attribute async="true",使其成为Asynchronous
                   3.jBPM可以配置成使用JMS或者内置的异步消息组件,用于异步执行过程中的通信。
 
                   4.jBPM内建消息组件会将消息存在JBPM_MESSAGE表中,org.jbpm.msg.command.CommandExecutor则从数据库中读消息、执行消息和删除消息。
 
14.                     Business Calendar
                   1.Business Calender 存储了Business hours,可以用于计算预期的Tasks和Timers。
                    2.Duration的语法<quantity> [business] <unit>
                    3.org/jbpm/calendar/jbpm.business.calendar.properties 定义了Business Hour
 
15.                     Logging
                   1.Logging记录流程的执行过程,以便后续的分析和审计。
                   2. org.jbpm.logging.log.ProcessLog,继承该类的子类都可以作为记录。
public class LoggingInstance extends ModuleInstance {
 ...
 public void addLog(ProcessLog processLog) {...} // 增加Log
 public void startCompositeLog(CompositeLog compositeLog) {...} //开始CompositeLog
 public Map findLogsByProcessInstance(long processInstanceId) {...}//获取Logs
 public List findLogsByToken(long tokenId) {...}//获取Logs
 ...
}
 
                   3.CompositeLog是一个Parent Log,以目录结构组织Child Logs
startCompositeLog(new MyCompositeLog());
try {
 ...
} finally {
 endCompositeLog();
}
16.                     jBPM Process Definition Language(jPDL)
               1.介绍了XML格式和将所有Process Definition 相关文件打包成par的机制。
                2.有三种部署方式:Process Designer Tool,ant task 和 编程部署。
                3.利用ant 部署
<target name="deploy.par">
 <taskdef name="deploypar" classname="org.jbpm.ant.DeployParTask">
    <classpath --make sure the jbpm-[version].jar is in this classpath--/> 
 </taskdef> 
 <deploypar par="build/myprocess.par" />
</target>
 
                4.编程完成部署
org.jbpm.jpdl.par.ProcessArchiveDeployer
                5.进程版本管理。在Process Definition部署后是不鼓励改动的,因为会引起很多意想不到的问题,但是jBPM根据Process Definition 的名字自动管理多个版本,使之同时存在于数据库中,已经创建的Process Instance按创建是的Process Definition继续执行,而新创建的Process Instance则按新的Process Definition来执行。
 
                6.详细介绍了如何将ProcessDefinition.xml和相关的Delegation Classes打包。利用jBPM的Class Loader来完成。
                7.详细介绍jPDL中定义的各种标签的含义。
17.                     Security
                 1.这是jBPM正在alpha测试的模块,包括身份认证Authentication和授权Authorization
                  2.验证是指由谁执行,授权是该用户是否有权限访问特定资源。
18.                     TDD for Workflow
                 
                  1.一个实际的例子来介绍如何对Process Definition进行TDD 。
                  
19.                     pluggable architecture
                   1.介绍了jBPM的体系结构。各个功能都设计为模块,核心模块为Process Definition和Process Excution,其它功能模块都能很方便地插入,例如Task Management、Timer和Context等。
                   2.可以自定义流程解析器等模块。例如,
public interface ProcessArchiveParser {
 
 void writeToArchive(ProcessDefinition processDefinition, ProcessArchive archive);
 ProcessDefinition readFromArchive(ProcessArchive archive, ProcessDefinition processDefinition);
 
}
 
20.                     Resource
·        Home Page: http://www.jboss.com/products/jbpm
·        jBPM Wiki:介绍了如何通过Eclipse自定义并部署流程: http://wiki.jboss.org/wiki/Wiki.jsp?page=JbpmGettingStarted
·         在jbpm-starters-kit-3.1.1/jbpm/doc目录下有jBPM所有的Java API文档。
 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值