JBPM 工作流技术应用

 工作流 就是工作流程的计算模型,即将工作流程中的工作如何前后组织在一起的逻辑和规则在计算机中以恰当的模型进行表示并对其实施计算.

 工作流要解决的主要问题是:为实现某个业务目标,在多个参与者之间,利用计算机,按某种预定规则自动传递文档、信息或者任务。


 工作流属于计算机支持的协同工作(Computer Supported Cooperative Work,CSCW)的一部分。后者是普遍地研究一个群体如何在计算机的帮助下实现协同工作的。

1.2 工作流系统的主要组成部分
 过程定义工具
用来创建计算机可处理的业务过程描述。它可以是形式化的过程定义语言或对象关系模型,也可以是简单地规定用户间信息传输的一组路由命令。
 过程定义
过程定义(数据)包含了所有使业务过程能被工作流执行子系统执行的必要信息。这些信息包括起始和终止条件、各个组成活动、活动调度规则、各业务的参与者需要做的工作、相关应用程序和数据的调用信息等。
 工作流引擎
工作流引擎是工作流管理系统的核心软件组元。它的功能包括:解释过程定义;创建过程实例并控制其执行;调度各项活动;为用户工作表添加工作项;通过应用程序接口(API)调用应用程序;提供监督和管理功能。
 工作流控制数据
指被工作流引擎管理的系统数据,例如工作流实例的状态信息、每一活动的状态信息等。

 工作流相关数据
----指与业务过程流相关的数据。工作流管理系统使用这些数据确定工作流实例的状态转移,例如过程调度决策数据、活动间的传输数据等。工作流相关数据既可以被工作流引擎使用,也可以被应用程序调用。
 工作表和工作表处理程序
工作表列出了与业务过程的参与者相关的一系列工作项,工作表处理程序则对用户和工作表之间的交互进行管理。工作表处理程序完成的功能有:支持用户在工作表中选取一个工作项,重新分配工作项,通报工作项的完成,在工作项被处理的过程中调用相应的应用程序等。
 应用程序和应用数据
应用程序可以直接被工作流管理系统调用或通过应用程序代理被间接调用。通过应用程序调用,工作流管理系统部分或完全自动地完成一个活动,或者对业务参与者的工作提供支持。与工作流控制数据和相关数据不同,应用数据对应用程序来讲是局部数据,对工作流管理系统的其他部件来说是不可见的。


1.3 工作流系统的标准和产品

 标准
1993年成立了工作流管理联盟(Workflow Management Coalition,WFMC)。此后,该组织颁布了一系列工作流产品标准,包括工作流参考模型、工作流术语表、工作流管理系统各部分间接口规格、工作流产品的互操作性标准等。

 工作流产品主要分为两大类
一类是基础的工作流系统,提供引擎、设计器、相关接口等。应用系统的开发商可以基于此类系统开发具有工作流管理功能的应用软件。典型产品如JBOSS.的JBMP、IBM的FlowMark等。
另一类是应用了工作流技术,包括内置较完整的工作流功能,但面向应用的应用级软件系统,这种系统是直接面向最终用户的流程化应用。同时,系统中还往往针对应用需要,集成了其他功能。比如我们的新OA系统,就是以工作流技术为核心的全面的企业办公自动化(OA)产品。


2. JBMP工作流系统介绍
2.1 JBoss jBPM 图形化流程设计器
JBoss jBPM 也包括一个图形化的流程设计工具. 这个设计器是用来创作商业流程.
JBoss jBPM 图形设计器是一个Eclipse插件, 图形化设计工具最重要的特性是它同时支持业务分析员和技术开发人员. 这样就可以在业务流程建模和实际执行之间平滑转换.

图 2.1
JBoss jBPM 图形设计器界面
2.2 JBoss jBPM核心组件

JBoss jBPM 核心组件是纯粹的Java(J2SE)软件,来处理流程定义和运行时的流程实例执行. 它实际对应的是工作流的如下功能:工作流引擎,工作流控制数据,工作流相关数据等。
JBoss jBPM 是一个Java库. 因此,它可以用在任何java环境比如web 应用程序,Swing应用程序,EJB,Web Service等等. jBPM 库可以被打包作为sateless session EJB(无状态会话EJB). 这可以用做集群的发布具有极高的吞吐量可伸缩性. 无状态会话EJB根据J2EE 1.3规范重新写过所以可以发布到任何应用服务器上.
JBoss jBPM 核心组件被打包成一个简单的Java库文件.依赖你所使用的功能性, 库 jbpm-3.0.jar及一些相关的第三方的库比如 . hibernate, dom4j 等等.

图 2.2
JBoss jBPM组件库列表
永久性方面, jBPM内部使用hibernate. 除了传统的O/R 映射外, hibernate也分析不同数据库系统的SQL方言 ,这使jBPM在当前所有的数据库上都可以移植.
JBoss jBPM API 可以从项目中任意编写的Java软件访问,比如Web应用程序,EJB,或web Service组件,消息bean或其他java组件.
2.3 jBPM控制台web应用程序
jBPM 控制台web应用程序是为两个目的服务的.首先通过这个平台发布你的流程. 其次, 它也是一个管理和监视控制台允许检查和操作运行中的流程实例。

图 2.3
jBPM控制台


3. 配置JBPM开发环境
3.1 环境
安装Eclipse3.3
安装MyEclipse6.0
安装Tomcat5.5
安装MySQL5.0
下载JBoss jBPM Starters Kit 3.1.4
下载后解压到E:\software\jbpm-starters-kit-3.1.4\jbpm-starters-kit-3.1.4目录下含有五个子目录:
 jbpm jBPM的软件包,包含源码,例子等文件内容。
 jbpm-bpel只含有一个网页
 jbpm-db各种数据库hibernate配置文件示例,有些还包含了相应的jdbc驱动程序。
 jbpm-designer辅助开发jBPM的Eclipse插件,具体在jbpm-gpd-feature子目录中
 jbpm-server一个已经配置好了的基于JBoss的jBPM示例。
安装jBPM的Eclipse开发插件(略)
3.2 配置
3.2.1建库

在MySQL中建立数据库jbpm。字符集采用GBK。建表SQL如下:
CREATE DATABASE `jbpm`
CHARACTER SET 'gbk'
COLLATE 'gbk_chinese_ci';

3.2.2导入工程

启动myEclipse,通过“Import”将jBPM工程导入eclipse中.

3.2.3添加MySQL驱动
在工程jbpm的lib目录下建立mysql文件夹,将MySQL需要的JDBC驱动程序拷贝其中。

3.2.4建立数据库表
在工程jbpm的src/resources目录下建立mysql目录,并将jbpm/src/resources/hsqldb目录下的所有文件(create.db.hibernate.properties和identity.db.xml)拷贝入mysql中.
 修改create.db.hibernate.properties 中下述代码
hibernate.dialect=org.hibernate.dialect.MySQLDialect
hibernate.connection.driver_class=com.mysql.jdbc.Driver
hibernate.connection.url=jdbc:mysql://192.200.1.104:3306/jbpm
hibernate.connection.username=zhoucw
hibernate.connection.password=0632
hibernate.show_sql=true


说明 :hibehibernate.dialect 是hibernate用来解析的SQL的特定语法,这里表示用Mysql语法。
hibernate.connection.driver_class是用的驱动名称。
hibernate.connection.url 是数据库连接。


 修改build.deploy.xml
<target name="create.db" depends="declare.jbpm.tasks, db.clean, db.start"
description="creates a hypersonic database with the jbpm tables and loads the processes in there">
在这段代码的前面添加
<target
name="create.db.mysql"
depends="declare.jbpm.tasks"
description="creates a mysql database with the jbpm tables and loads the processes in there.
Run this target after starting mysql">
<jbpmschema
actions="create"
cfg="${basedir}/src/config.files/hibernate.cfg.xml"
properties="${basedir}/src/resources/mysql/create.db.hibernate.properties" />
<loadidentities
file="${basedir}/src/resources/mysql/identity.db.xml"
cfg="${basedir}/src/config.files/hibernate.cfg.xml"
properties="${basedir}/src/resources/mysql/create.db.hibernate.properties" />
<ant antfile="build.xml"
target="build.processes"
inheritall="false" />
<deployprocess
cfg="${basedir}/src/config.files/hibernate.cfg.xml"
properties="${basedir}/src/resources/mysql/create.db.hibernate.properties">
<fileset dir="build" includes="*.process" />
</deployprocess>
</target>
<property
file="${basedir}/src/resources/mysql/create.db.hibernate.properties" />
<target
name="execute.mysql.sql"
description="execute a mysql sql script with -Dmysql.script=path-to-script.">
<sql
driver="${hibernate.connection.driver_class}"
url="${hibernate.connection.url}" userid="${hibernate.connection.username}"
password="${hibernate.connection.password}"
delimiter=";"
autocommit="true"
οnerrοr="continue">
<classpath
refid="classpath.ant" />
<transaction
src="${mysql.script}" />
</sql>
</target>

在myeEclipse中,右键点击工程jbpm下的build.deploy.xml文件,在菜单中选择“Run As\Ant Build…”,在出现的窗口中选择“target”为“create db mysql”,然后点击“Run”按钮,开始运行Ant。
等运行完毕后,可以在MySQl中查看到相应得数据库表结构已经建立,并且已经部署了websale需要用到的流程信息。

图 3.1
数据库表结构

 数据库表结构的说明:
JBPM_ACTION action记录表
JBPM_DECISIONCONDITIONS 结果条件表
JBPM_DELEGATION 委托表
JBPM_EVENT 事件表 处理进入或者离开事件
JBPM_EXCEPTIONHANDLER 异常处理表
JBPM_ID_GROUP 用户组表
JBPM_ID_MEMBERSHIP 用户成员表 表现用户和组之间的多对多关系
JBPM_ID_PERMISSIONS 用户权限表
JBPM_ID_USER 用户表
JBPM_MODULEDEFINITION 模块定义表
JBPM_MODULEINSTANCE 模块实例表
JBPM_NODE 流程节点表
JBPM_POOLEDACTOR 汇集参与着表
JBPM_PROCESSDEFINITION 流程定义表
JBPM_PROCESSFILE 流程文件表
JBPM_PROCESSFILEBLOCK 流程文件块表
JBPM_PROCESSINSTANCE 流程实例表
JBPM_RUNTIMEACTION 运行中行为表
JBPM_SCRIPTVARIABLES 脚本变量表
JBPM_SWIMLANE 泳道表
JBPM_SWIMLANEINSTANCE 泳道实例表
JBPM_TASK 任务表
JBPM_TASKACTORPOOL 用户行为汇总
JBPM_TASKINSTANCE 任务实例
JBPM_TIMER 计时表
JBPM_TOKEN 令牌表
JBPM_TOKENVARIABLEMAP 令牌变量影射表
JBPM_TRANSITION 转换表
JBPM_VARIABLEINSTANCE 变量实例表
JBPM_VARIABLEINSTANCEBLOCK 变量实例块表
JBPM_VARIABLEMAPPING 变量影射表

3.2.5打包成war文件
 修改hibernate.cfg.xml
在myeclipse中打开工程jbpm下的src/config.files目录下的hibernate.cfg.xml文件,修改其中的内容为:
<!-- jdbc connection properties -->
<property name="hibernate.dialect">
org.hibernate.dialect.MySQLDialect
</property>
<property name="hibernate.connection.driver_class">
com.mysql.jdbc.Driver
</property>
<property name="hibernate.connection.url">
jdbc:mysql://192.200.1.104:3306/jbpm
</property>
<property name="hibernate.connection.username">zhoucw</property>
<property name="hibernate.connection.password">0632</property>
<!-- other hibernate properties -->
<property name="hibernate.show_sql">true</property>
<property name="hibernate.format_sql">false</property>
<property name="hibernate.use_sql_comments">false</property>

 修改build.deploy.xml
在eclipse中打开工程jbpm下的build.deploy.xml文件,找到如下target”,<target name="build.webapp" description="builds jbpm.war">并将此“target”内容更改为如下内容:
<target name="build.webapp" description="builds jbpm.war">
<ant antfile="build.xml" target="build.webapp" />
<mkdir dir="build/jbpm.war.dir" />
<copy todir="build/jbpm.war.dir">
<fileset dir="src/resources/jbpm.war" />
</copy>
<copy todir="build/jbpm.war.dir/WEB-INF/classes">
<fileset dir="src/config.files" />
</copy>
<copy todir="build/jbpm.war.dir/WEB-INF/lib">
<fileset dir="build"
includes="jbpm*.jar,converter.jar"
excludes="*src*.jar" />
<fileset dir="lib/jsf" includes="*.jar" />
<fileset dir="lib/dom4j" includes="*.jar" />
<fileset dir="lib/hibernate" includes="*.jar" />
<fileset dir="lib/mysql" includes="*.jar" />
<fileset dir="lib/commons"
includes="commons-digester-*.jar,
commons-beanutils-*.jar,
commons-fileupload-*.jar" />
<fileset dir="lib/jboss"
includes="*.jar"
excludes="jboss*.jar,
*servlet*.jar,
*hsql*.jar" />
</copy>
<jar destfile="build/jbpm.war">
<fileset dir="build/jbpm.war.dir" />
</jar>
</target>

在eclipse中,右键点击工程下的build.deploy.xml文件,在菜单中选择“Run As\Ant Build…”,在出现的窗口中选择“target”为“build webapp”,然后点击“Run”按钮,开始运行Ant。

3.2.6发布应用

在工程下build/jbpm.war.dir目录中,将jbpm.war文件拷贝到TOMCAT_HOME\webapps目录下。启动Tomcat。
在浏览器中输入地址http://localhost:8080/jbpm,出现登录页面,配置成功。





4. 开发JBPM工作流(报销流程)
4.1 新建一个JBPM项目

图 4-1
testJbpm项目结构

4.2 绘制 工作流程图


点击\processdefinition.xml ,在可视工具下面绘制工作流程图如下:

图 4-1
报销流程

其对应的JPDL(JBPM Process Definition Language)表示的processdefinition.xml 内如如下:

<?xml version="1.0" encoding="UTF-8"?>
<process-definition
xmlns="urn:jbpm.org:jpdl-3.1" name="testNo2">
<start-state name="start">
<task name="apply account">
<controller>
<variable name="baoxiaoId" access="read,write,required" mapped-name="baoxiao_ID"></variable>
<variable name="baoxiaoNum" access="read,write,required" mapped-name="baoxiao_num"></variable>
</controller>
<assignment class="com.test.action.UserAssignment"></assignment>
</task>
<transition name="" to="to direct"></transition>
</start-state>

<decision name="to direct">
<handler class="com.test.action.DecisionProcess"/>
<transition name="to caiwu" to="caiwu check apply"></transition>
<transition name="to boss" to="boss signature apply"></transition>
</decision>
<task-node name="boss signature apply">
<task name="boss signature">
<controller>
<variable name="baoxiaoId" access="read" mapped-name="baoxiao_ID"></variable>
<variable name="baoxiaoNum" access="read" mapped-name="baoxiao_num">
</variable>
</controller>
<assignment class="com.test.action.BossAssignment">
</assignment>
</task>
<transition name="to confirm" to="confirm apply1"></transition>
</task-node>
<task-node name="caiwu check apply">
<task name="caiwu check">
<controller>
<variable name="baoxiaoId" access="read" mapped-name="baoxiao_ID"></variable>
<variable name="baoxiaoNum" access="read" mapped-name="baoxiao_num">
</variable>
</controller>
<assignment class="com.test.action.CaiWuAssignment">
</assignment>
</task>
<transition name="to confirm" to="confirm apply2"></transition>
</task-node>
<task-node name="confirm apply1">
<task name="confirm1">
<assignment class="com.test.action.UserAssignment"></assignment>
</task>
<transition name="" to="end1"></transition>
</task-node>
<task-node name="confirm apply2">
<task name="confirm2">
<assignment class="com.test.action.UserAssignment"></assignment>
</task>
<transition name="" to="end1"></transition>
</task-node>
<end-state name="end1"></end-state>
</process-definition>

说明:
 <process-definition
xmlns="urn:jbpm.org:jpdl-3.1" name="testNo2">
部署时流程的名称就是name="testNo2",JBPM的版本机制允许在数据库中多个同名流程定义共存。可以用jbpm API通过一个给定的processName查找最近的流程定义.
ProcessDefinition pd=JbpmContext.getGraphSession() .findLatestProcessDefinition("testNo2").

 <start-state name="start">
……
</start-state>
整个流程的开始节点,所有的流程实例从这里开始。

 <end-state name="end1"></end-state>
每一个流程定义都会有一个结束节点,与开始节点对应。

 <task name="apply account">
<controller>
<variable name="baoxiaoId" access="read,write,required" mapped-name="baoxiao_ID"></variable>
<variable name="baoxiaoNum" access="read,write,required" mapped-name="baoxiao_num"></variable>
</controller>
<assignment class="com.test.action.UserAssignment"></assignment>
</task>
Task 是是流程定义里的一部分,它决定了task instance的创建和分配,对参与流程的对象来说,他们要处理的task instance,也就是外部对象要处理的任务,是驱动点,所以在这里需要设置任务分配的逻辑,来决定有哪个参与者来驱动这个流程实例。
<assignment>
……
</assignment>
表示任务分配的逻辑在com.test.action.UserAssignment对象中实现。
<controller>
……
</controller>
定义了两个流程变量,在这个流程中,我们主要读取,和改变这两个变量,决定流程的走向。

 <transition name="" to="to direct"></transition>
转换用来指定节点之间的连接。

 <decision name="to direct">
<handler class="com.test.action.DecisionProcess"/>
<transition name="to caiwu" to="caiwu check apply"></transition>
<transition name="to boss" to="boss signature apply"></transition>
</decision>
decision用以决定在多个执行路径中哪个才可以被执行。
<handler class="com.test.action.DecisionProcess"/>中的类决定了要走那条路径。

 <task-node name="boss signature apply">
……
</task-node>
最普遍的方式是在task-node节点下定义一个或多个任务. 。默认情况下,流程在task-node节点会处于等待状态,直到所有的任务被执行完毕.
任务节点主要面对的是参与者,在任务节点有些灵活的属性应用。如:
Signal属性:
{unsynchronized|never|first|first-wait|last|last-wait}

Unsynchronized:表明token不会在本节点停留,而是直接到后面的节点。

never: 表明三个任务都完成后,token仍然不会指向后面的节点;需要自己 手动调用processInstance.signal()才会驱动流程到下面的节点.

first: 表明只要有一个任务完成后,token就指向后面的节点.

first-wait: 表明当第一个任务实例完成时继续执行;当在a节点入口处没有任务创建时,token在a任务节点处等待,直到任务被创建或完成。

last-wait:当最后一个任务实例完成时候继续执行下去。 当a这个任务节点没有任务被建立时,任务节点等待直到任务被建立。

 以上解释只是针对上述例子里涉及的内容,对每个元素其实还有很多不同的属性以及用法。可以参考jbpm开发指南.pdf
4.3 编写 工作流程控制类
在JPDL工作流定义文件中,会有一些逻辑上的表达,是图形无法清楚表述的,这时候就需要为一个逻辑写上一个类,来体现相对复杂的流程逻辑。比如上面提到的:
<assignment class="com.test.action.UserAssignment"></assignment>
当流程执行到某个Task的时候,引时流程引挚要调用相应的assignment将当前的task分配(委派)给某个参与者,外部参与者可以是一个人也可以是某个系统等。
com.test.action.UserAssignment内容如下:
public class UserAssignment implements AssignmentHandler {

public void assign(Assignable assignable, ExecutionContext executionContext)
throws Exception {
assignable.setActorId("actor1");
// TODO Auto-generated method stub

}

}

 这个类首先实现AssignmentHandler接口。
 覆盖assign方法,assignable.setActorId("actor1"); 表示这个任务将分配给叫 "actor1"的参与者,在真实系统中,我们参与者可能来之于数据库,或者别的系统。

<handler class="com.test.action.DecisionProcess"/>
一个decision用以决定在多个执行路径中哪个才可以被执行。这个逻辑就在com.test.action.DecisionProcess体现:
public class DecisionProcess implements DecisionHandler {

public String decide(ExecutionContext executionContext) throws Exception {
// TODO Auto-generated method stub
String go="";
Object baoxiaoId=executionContext.getContextInstance().getVariable("baoxiaoId");
Object baoxiaoNum=executionContext.getContextInstance().getVariable("baoxiaoNum");

if(Integer.parseInt((String)baoxiaoNum) >1000){
go="to boss";
}
else{

go="to caiwu";
}

return go;
}

}

 这个类首先实现DecisionHandler接口。
 覆盖decide方法,通过executionContext.getContextInstance().getVariable("baoxiaoNum");获得baoxiaoNum这个流程中的变量,其实这个变量将作为流程实例的一部分被保存在数据库中。
根据条件,如果返回 go="to boss" 就走 "to boss" 这条路径。
如果返回 go=" to caiwu " 就走 " to caiwu " 这条路径。


4.4 发布工作流程
这里我们采用流程引擎IDE工具提供的发布方式。

图 4.3
发布流程IDE
在发布以前,必须完成‘第三章 配置Tutorial环境’并启动Tomcat5.5。
(这里有一点需要注意,在JBPM中如果涉及到子流程,一定要先发布子流程再发布主流程,不然可能会造成找不到子流程的错误。)修改Server Deployer ,Server Name,Server Port三个和发布有关的设置。其他可以默认。点击 ‘Deploy Process Archive…’,按钮自动完成发布。如果有错误,可以先查看processdefintion.xml文件中的内容是否正确,我碰到发布不成功,基本是processdefintion.xml语法有错误。





5. 使用JBPM工作流(报销流程)
5.1 使用JBMP工作流

 工作流程序的开发应该分两部分:
 工作流的定义,发布。
 业务系统和工作流的交互界面的开发。

 工作流系统作为服务程序发布在像tomcat这样的应用服务器上运行。业务系统作为客户程序,通过工作流引擎提供的API,进行交互。 api的帮助文档在
http://docs.jboss.com/jbpm/v3/javadoc/。

 根据这个思路,我们定义了三个类分别代表,业务系统和工作流的交互界面。

No1Actor1Test 代表 参与者‘Actor1’和工作流的交互界面类,内容如下:

public class No1Actor1Test {
/**
* @param args
*/
public static void main(String[] args) {
//设置俩个变量
String user_name = "actor1";
String baoxiaoNum = "1300";
//jbpm的配置类,作为JbpmContext的工厂类
JbpmConfiguration config=JbpmConfiguration.getInstance();
//jbpm上下文类,它提供一系列服务 ,如a hibernate session,
JbpmContext jbpmContext=config.createJbpmContext();
//返回一个hibernate session
Session session=jbpmContext.getSessionFactory().openSession();
//返回一个hibernate Transaction
Transaction trans=session.beginTransaction();
//返回一个名字为‘testNo2’的工作流定义
ProcessDefinition pd=jbpmContext.getGraphSession().findLatestProcessDefinition("testNo2");
//生成一个工作流实例
ProcessInstance pi=pd.createProcessInstance();
//在根令牌上生成一个任务实例,并分配给参与者
TaskInstance ti=pi.getTaskMgmtInstance().createStartTaskInstance();
long pi_id= pi.getId();
No1Constant.baoxiaoId =pi_id;
//设置流程变量
ti.setVariable("baoxiaoId",pi_id);
ti.setVariable("baoxiaoNum",baoxiaoNum);
//任务结束,流到下个节点
ti.end();
//事务提交
trans.commit();
session.close();
jbpmContext.close();
}

}

No1Boss1Test 代表 参与者‘Boss1’和工作流的交互界面类,内容如下:

public class No1Boss1Test {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String user_name = "boss1";
//jbpm的配置类,作为JbpmContext的工厂类
JbpmConfiguration config=JbpmConfiguration.getInstance();
// jbpm上下文类,它提供一系列服务 ,如a hibernate session,
JbpmContext jbpmContext=config.createJbpmContext();
//获得分配给boss1的任务列表
List ls=jbpmContext.getTaskList(user_name);
//任务数量
int num = ls.size();
System.out.println(String.valueOf(num));
for(int i= 0;i<num;i++){
//这部分就是业务逻辑需要执行的内容
TaskInstance ti = (TaskInstance)ls.get(i);
System.out.println(ti.getActorId()+"完成"+ti.getName());
//离开这个节点
ti.end();
}
//关闭的时候,会自动提交事务。
jbpmContext.close();
}

}

No1CaiwuTest 代表 参与者‘Caiwu’和工作流的交互界面类,内容如下:

public class No1CaiwuTest {

/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
String user_name = "Caiwu1";
JbpmConfiguration config=JbpmConfiguration.getInstance();
JbpmContext jbpmContext=config.createJbpmContext();
//TaskInstance ti = jbpmContext.getTaskInstance(19);

ProcessInstance pi=jbpmContext.getProcessInstance(12);
Token token = pi.getRootToken();
System.out.println(token.getNode().getName());
//System.out.println(ti.getActorId());
List ls=jbpmContext.getTaskList(user_name);

int num = ls.size();
System.out.println(String.valueOf(num));
for(int i= 0;i<num;i++){
TaskInstance ti = (TaskInstance)ls.get(i);
System.out.println(ti.getActorId()+"完成"+ti.getName());
ti.end();
}
jbpmContext.close();
}

}

5.2 监控 JBMP工作流
通过jbpm的控制台程序,可以监控jbpm实例运作的状态。http://localhost:8080/jbpm
监控工作流实例目前的令牌位置。

图5.2
工作流程实例图
监控一个工作流实例的完成情况


图5.2
工作流程实例完成统计图
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值