上一篇的示例中我们尝试用了jbpm Service API,现在我们仍然详细介绍API。
一, 流程引擎对象,ProcessEngine是jbpm4所有Service API之源
在jbpm中各种服务相互依存,但所有的service API都从ProcessEngine中获得,它是由
Configuration类构建的,即工作流引擎根据配置产生。
ProcessEngine是线程安全的,因此它可以保存在静态变量中,甚至JNDI命名服务
中或者其他重要位置。在应用中,所有线程和请求都可以使用同一个ProcessEngine对象,
以下代码告诉您如何获得ProcessEngine:
ProcessEngine processEngine=Configuration.getProcessEngine();
上面代码中的Configuration使用了classpath根目录下的默认配置文件jbpm.cfg.xml创
建一个ProcessEngine。如果你要自定义位置,那么可以这样做:
ProcessEngine processEngine=new Configuration().setResource(“myjbpm.xml”)
.buildProcessEngine();
然后,那6个service直接可以用processEngine.getXXX()得到。下面把这6个service描述一下:
RepositoryService—流程之源服务的借口。提供对流程定义的部署,查询,删除等操作。
ExecutionService—流程执行服务的借口。提供启动流程实例,“执行”推进,设置流程变量等操作
ManagementService—流程管理控制服务的接口,提供异步工作(Job)相关的执行和查询操作。
TaskService—人工任务服务的接口。提供对任务(Task)的创建,提交,查询,保存,删除等操作。
HistoryService—流程历史服务的接口。提供对流程历史库(即已完成的流程实例归
档)中历史流程实例,历史活动实例等记录的查询操作。还提供诸如某个流程定义中所有活动
的平均持续时间,某个流程定义中某转移的经过次数等数据分析服务。
IdentityService—身份认证服务的接口。提供对流程用户,用户组以及组成员关系的相关服务
二, 发起一个流程实例有这样几种方式
1, 常规方法:
ProcessInstance
processInstance=executionService.startProcessInstanceByKey(“order”);
2, 指定业务键发起流程实例,假如要对特定的业务实例来说,我们需要将每个流程
实例和一个独特的业务实例关联起来,比如一个保险流程的实例必然需要和一个保险单号关
联,一个订单流程的实例必然需要和一个订单号关联,以便业务上的查询或索引,那么我们就
可以通过为新启动的流程实例分配一个业务键来做到。一个业务键必须在此流程定义所有版本
的流程实例范围内是唯一的。比如以下:
ProcessInstance processInstance=executionService.startProcessInstanceByKey(“order”,”afei520”);
在上面种,afei520就是业务键,和特定的业务有关系。
注:最好指定一个业务键发起流程实例,一般情况下,在业务应用中,找到这样的业务键并不
困难,提供一个业务键的好处是可以根据业务来执行流程实例搜索,这是一个最佳实践。
3, 指定变量发起流程实例 如果新的流程实例需要一些输入参数启动,可以将这个参
数放在流程变量里,然后在发起流程时传入流程变量对象。代码如下:
Map<String, Object> valMap = new HashMap<String, Object>();
valMap.put("proposer", user);
//创建流程实例
return
executionService.startProcessInstanceByKey("loan",valMap);
三, 任务服务API,这里的任务是指jbpm task活动产生的人机交互业务。假如要展
示一个人的任务列表:
List<Task> tasks=taskService.findPersonalTasks(“afei”);
一般来说,任务会有一个表单,显示在一些用户界面中如jsp。这个表单需要读写与任务相关的流程数据,一般是通过任务变量的方式。如下代码:
String taskId=taskId;
Set<String> varis=taskService.getVariableNames()taskId;
//读取任务变量
Set<String> variableNames=taskService.getVariableNames(checkTask.getId());
for(Iterator<String> it=variableNames.iterator();it.hasNext();){
System.out.println("task vari:"+it.next());
}
Map<String,Object> variables=taskService.getVariables(checkTask.getId(),variableNames);
System.out.println("variables:"+variables);
或自行创建variables=new HashMap<String,Object>();
//设置”键值”形式的任务变量
Variables.put(“username”,”afei”);
Variables.put(“age”,111111);
//将变量存入任务
taskService.setVariables(taskId,variables);
四, 对于流程,任务,历史的查询是很重要的,从jbpm4开始,流程查询系统由一
组新的API来支持,这组API可以覆盖到大多数您能想到的查询。
比如流程实例查询:
List<ProcessInstance> results=executionService.
createProcessInstanceQuery().
processDefinitionId(“my_process_definition”).//流程定义Id
notSuspended().//未挂起
Page(0,50).list();//分页
比如任务的查询:
List<Task> tasks=taskService.createTaskQuery().
processInstanceId(piId).//流程实例
assignee(“Alex”).分配给Alex的任务
page(100,200).//分页
orderDesc(TaskQuery.PROPERTY_DUEDATE).
//根据日期逆向排序
List();
其他的服务以此类推
五, 下面看一个例子。
首先angel.jpdl.xml代码
<?xml version="1.0" encoding="UTF-8"?>
<process name="angel" xmlns="http://jbpm.org/4.4/jpdl">
<start name="start">
<transition name="to state" to="state"/>
</start>
<!-- state活动是等待活动。需要收到一个外部的执行信号才能流转通过。 -->
<state name="state">
<transition name="to task" to="task"/>
</state>
<!-- task活动是等待活动。在这里被分配给用户afei办理,afei办理完成提交任务后才能流转通过 -->
<task assignee="afei" name="task">
<transition name="to end" to="end"/>
</task>
<end name="end"/>
</process>
Java测试代码:
package org.test;
import org.jbpm.api.Execution;
import org.jbpm.api.ProcessInstance;
import org.jbpm.api.history.HistoryProcessInstance;
import org.jbpm.api.history.HistoryTask;
import org.jbpm.api.task.Task;
import org.jbpm.test.JbpmTestCase;
public class AngelTest extends JbpmTestCase {
String deploymentId;
@Override
public void setUp() throws Exception {
super.setUp();
deploymentId = repositoryService.createDeployment()
.addResourceFromClasspath("org/test/angel.jpdl.xml").deploy();
}
@Override
public void tearDown() throws Exception {
repositoryService.deleteDeploymentCascade(deploymentId);
super.tearDown();
}
public void testAfei() {
System.out.println("********testAfei start********");
// 使用执行服务:根据已部署流程定义的名称angel,发起流程实例
ProcessInstance pi = executionService
.startProcessInstanceByKey("angel");
// 获取流程实例ID
String pid = pi.getId();
// 获取当前活动的执行对象
Execution executionState = pi.findActiveExecutionIn("state");
// 断言当前活动即为state
assertNotNull(executionState);
// 使用执行服务:发出执行信号结束当前活动,继续流程的执行
executionService.signalExecutionById(executionState.getId());
// 使用执行服务:从持久化层中获取“最新”的流程实例对象
pi = executionService.findProcessInstanceById(pid);
Execution executionTask = pi.findActiveExecutionIn("task");
// 断言当前活动即为task
assertNotNull(executionTask);
// 使用任务服务:获取用户afei的任务,即task活动产生的任务
Task task = taskService.findPersonalTasks("afei").get(0);
// 使用任务服务:完成任务
taskService.completeTask(task.getId());
// 使用历史服务:创建历史任务查询
HistoryTask historyTask = historyService.createHistoryTaskQuery()
.taskId(task.getId()).uniqueResult();
// 断言上一步完成的任务已成为历史,即可通过历史任务查询获取之
assertNotNull(historyTask);
// 断言该流程实例已经结束
assertProcessInstanceEnded(pid);
// 使用历史服务:创建历史流程实例查询
HistoryProcessInstance hpi = historyService
.createHistoryProcessInstanceQuery().processInstanceId(pid)
.uniqueResult();
//断言该流程实例已经成为历史,即可通过历史流程实例查询获取它
assertNotNull(hpi);
//单元测试至此执行完毕
System.out.println("********testAfei end********");
}
}
这个例子主要是进一步看看Service API的功能及其使用场景。这个例子基本上走完了一个流程的完整生命周期,下一篇着重介绍Jbpm的核心————jPDL。
分享到:
相关推荐
通过对jbpm的学习,我们可以深入理解业务流程的生命周期,包括设计、部署、执行和监控等环节。 在jbpm的学习过程中,首先会接触到的是流程建模。使用BPMN(Business Process Model and Notation)语言,jbpm允许...
jBPM的设计旨在提供一个完整的业务流程生命周期管理解决方案,包括建模、部署、执行和监控。分发包通常包含库文件、源代码、文档以及示例。业务流程模型通过jPDL来定义,它涵盖了流程的开始、结束节点、任务分配、...
6. **流程实例的生命周期**:通过jPDL,你可以控制流程实例的启动、暂停、恢复和终止,以及查看实例的状态和历史。 7. **流程版本管理**:jbpm支持流程模型的版本控制,这意味着可以在不影响正在运行的流程实例的...
通过阅读《jBPM-jPDL学习笔记.pdf》,你可以深入了解这些概念,并学会如何使用jPDL编写和部署流程定义,从而在实际项目中实现灵活、可扩展的业务流程管理。这份资料对于初学者来说是一份很好的入门指南,能够帮助...
- JBPM引擎负责执行流程实例,它解析BPMN模型并管理流程实例的生命周期,包括启动、暂停、恢复和结束流程。 - 引擎还处理流程中的并发任务、分支逻辑(如 Exclusive Gateway)以及流程变量的存储和更新。 3. **...
流程实例的生命周期包括启动、执行、暂停、恢复和终止等状态。 ### 4. **任务管理** jBPM提供了任务服务,允许用户处理流程中的任务。任务可以分配给特定的个人或组,用户可以通过任务工作台来接受、完成或转交任务...
2. **学习笔记**:学习笔记通常是对理论知识的实践总结,可能会包含作者在学习过程中遇到的问题及解决方法,对理解jbpm4的实际操作有极大帮助。这些笔记可能涉及流程实例的创建、参与者管理、流程变量的使用等。 3....
"jBPM工作流应用开发指南目录.pdf"可能是整个jBPM开发文档的大纲,涵盖了从入门到进阶的所有主题,包括流程定义语言BPMN2的解析、jBPM的工作原理、流程实例的创建与管理、任务服务的使用、监听器和事件处理、持久化...
ProcessEngine负责生成流程实例,管理流程运行,并监控整个流程生命周期。BPMN(Business Process Model and Notation)是用于构建流程图的标准符号语言,它使得流程设计更为直观和易于理解。 在数据库层面,...