`
AngelAndAngel
  • 浏览: 234822 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

jbpm学习笔记(五) jbpm不同服务的详细介绍以及使用 走完流程整个生命周期

    博客分类:
  • jbpm
阅读更多
     上一篇的示例中我们尝试用了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的学习,我们可以深入理解业务流程的生命周期,包括设计、部署、执行和监控等环节。 在jbpm的学习过程中,首先会接触到的是流程建模。使用BPMN(Business Process Model and Notation)语言,jbpm允许...

    jBPM-jPDL学习笔记

    jBPM的设计旨在提供一个完整的业务流程生命周期管理解决方案,包括建模、部署、执行和监控。分发包通常包含库文件、源代码、文档以及示例。业务流程模型通过jPDL来定义,它涵盖了流程的开始、结束节点、任务分配、...

    jbpm学习资料,jbpm教程

    6. **流程实例的生命周期**:通过jPDL,你可以控制流程实例的启动、暂停、恢复和终止,以及查看实例的状态和历史。 7. **流程版本管理**:jbpm支持流程模型的版本控制,这意味着可以在不影响正在运行的流程实例的...

    jBPM-jPDL学习笔记.zip

    通过阅读《jBPM-jPDL学习笔记.pdf》,你可以深入了解这些概念,并学会如何使用jPDL编写和部署流程定义,从而在实际项目中实现灵活、可扩展的业务流程管理。这份资料对于初学者来说是一份很好的入门指南,能够帮助...

    jbpm实战讲解.pdf

    - 细致解析了JBPM中的各种服务及其功能,同时展示了如何通过这些服务完成一个完整流程的生命周期。 **1.6 JPDL流程定义语言详解** - JPDL是JBPM的核心流程定义语言,这部分详细介绍了JPDL的语法和结构,对于定制...

    JBPM研究笔记

    - JBPM引擎负责执行流程实例,它解析BPMN模型并管理流程实例的生命周期,包括启动、暂停、恢复和结束流程。 - 引擎还处理流程中的并发任务、分支逻辑(如 Exclusive Gateway)以及流程变量的存储和更新。 3. **...

    jBPM 视频教程 管理流程定义

    流程实例的生命周期包括启动、执行、暂停、恢复和终止等状态。 ### 4. **任务管理** jBPM提供了任务服务,允许用户处理流程中的任务。任务可以分配给特定的个人或组,用户可以通过任务工作台来接受、完成或转交任务...

    jbpm4文档集合

    2. **学习笔记**:学习笔记通常是对理论知识的实践总结,可能会包含作者在学习过程中遇到的问题及解决方法,对理解jbpm4的实际操作有极大帮助。这些笔记可能涉及流程实例的创建、参与者管理、流程变量的使用等。 3....

    jBPM工作流应用开发指南目录和个人笔记

    "jBPM工作流应用开发指南目录.pdf"可能是整个jBPM开发文档的大纲,涵盖了从入门到进阶的所有主题,包括流程定义语言BPMN2的解析、jBPM的工作原理、流程实例的创建与管理、任务服务的使用、监听器和事件处理、持久化...

    Activiti课程笔记从入门到实践.doc

    ProcessEngine负责生成流程实例,管理流程运行,并监控整个流程生命周期。BPMN(Business Process Model and Notation)是用于构建流程图的标准符号语言,它使得流程设计更为直观和易于理解。 在数据库层面,...

Global site tag (gtag.js) - Google Analytics