`
hz_chenwenbiao
  • 浏览: 1007880 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

JBMP入门

阅读更多

(1)定义如下工作流程:

<?xml version="1.0" encoding="UTF-8"?>

<process name="event" xmlns="http://jbpm.org/4.3/jpdl">
	<on event="start">
		<event-listener class="com.family168.ProcessEventListener"/>
	</on>
	<on event="end">
		<event-listener class="com.family168.ProcessEventListener"/>
	</on>
	<start g="156,56,48,48" name="start1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<transition g="-49,-18" name="to state1" to="state1"/>
	</start>
	<state g="133,160,92,52" name="state1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<transition g="-42,-18" name="to end1" to="end1"/>
	</state>
	<end g="155,275,48,48" name="end1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
	</end>
</process>

 即简单的流程:start ---> state1 ---> end

 

(2)流程测试:

package com.family168;

import junit.framework.TestCase;
import org.jbpm.api.*;
import java.util.*;

public class HelloTest extends TestCase {
	ProcessEngine processEngine;

	public HelloTest() {
		processEngine = Configuration.getProcessEngine();
	}

	public void testDeploy() {
		//定义repositoryService主要是对为了查看流程管理流程用的
		RepositoryService repositoryService = processEngine
				.getRepositoryService();
		String deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("helloworld.jpdl.xml").deploy();//将流程定义(就是工作的流程写成的XML文件)发布到流程引擎中去
		
		//下面是获取所有已发布的流程定义
		List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().list();
		for (ProcessDefinition pd : list) {
			System.out.println(pd.getId());//打印流程定义的ID
		}
		
		//删除不需要的流程定义,即将发布到工作引擎中的流程定义删除掉
		repositoryService.deleteDeploymentCascade(deploymentId);//使用Cascade表示级联删除
		System.out.println(repositoryService.createProcessDefinitionQuery().list().size());
	}
}

 

package com.family168;

import junit.framework.TestCase;
import org.jbpm.api.*;
import java.util.*;

public class ProcessInstanceTest extends TestCase {
	
	//要先启用工作流引擎,所有操作都是从processEngine开始的。
	ProcessEngine processEngine;

	public ProcessInstanceTest() {
		//下面的默认方式会到类路径下去找jbpm.cfg.xml加载这个配置文件信息,再生成工作引擎
		processEngine = Configuration.getProcessEngine();//这样就可以获取到流程引擎
	}

	protected void setUp() {
		//在操作之前我们得先发布一个流程定义,这样才能发起流程的操作
		processEngine.getRepositoryService().createDeployment()
				.addResourceFromClasspath("helloworld.jpdl.xml").deploy();//jpdl流程文件都是以.jpdl.xml作为扩展名的
	}

	//下面是测试流程实例
	public void testProcessInstance() {
		//首先是获取一个ExecutionService的实例,这是用来控制流程实例的。
		ExecutionService executionService = processEngine.getExecutionService();
		//启动一个新的流程实例
		ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");//一发布一个流程,那么系统会分配一个id给这个流,具体的过程见jBPM4.1使用指南23页讲得很清楚
		//
		System.out.println(pi);//运行后会返回:execution[helloworld.7]它是发布的流程的一个实例
		/*
		 * pi就是流程实例了,那么它开启后,就会往下执行,这里设置打印它的运行状态,看这个实例结束了没有,这里的结果为false,可以看出实例并没有结束
		 * 实例没有结束的原因:我们发布的helloworld.jpdl.xml文件就设置了是从start1---->task------>end1的流程,所以在开启流程实例后,它会运行到task
		 * 后会处于等待状态,工作流主要就是要等待人来审判嘛,所以到一个结点后就停下来,处理后才能往下执行。
		 */
		System.out.println(pi.isEnded());
		
		//为了让等待状态的实例继续进行下去,这里可以 用signal来将等待中的实例唤醒,然后进入下一个工作结点,这里下从task到下一个工作结点就到end1了,就结束了,所以下面的打印实例ended的情况是true
		pi = executionService.signalExecutionById(pi.getId());
		System.out.println(pi.isEnded());
	}

	//下面是将一个工作实例取消掉,即到中途就让它结束,有两种方式,一是下面的取消方式,一是再下面的删除方式。
	public void testProcessInstanceEnd() {
		ExecutionService executionService = processEngine.getExecutionService();
		ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");
		executionService.endProcessInstance(pi.getId(), "cancel");//发送取消命令,会取消掉在等待中的队列
	}
	
	public void testProcessInstanceDelete() {
		ExecutionService executionService = processEngine.getExecutionService();
		ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");
		executionService.deleteProcessInstanceCascade(pi.getId());//直接将流程实例删除掉	
	}
	
	//下面方法是获取所有的流程实例,用executionService.createProcessInstanceQuery().list()方法可以获取到所有开启的流程实例的信息
	public void testProcessInstanceList() {
		ExecutionService executionService = processEngine.getExecutionService();
		ProcessInstance pi = executionService.startProcessInstanceByKey("helloworld");
		ProcessInstance pi2 = executionService.startProcessInstanceByKey("helloworld");
		List<ProcessInstance> list = executionService.createProcessInstanceQuery().list();
		for (ProcessInstance processInstance : list) {
			System.out.println(processInstance.getId());//可以查看自动生成的流程实例ID
		}
	}
}

 (3)定义task的流程定义(task.jpdl.xml),还是简单的流程:start ---> state1 ---> end,只是加入了工作组,在下面的测试中会用到组任务的分派及处理:

<?xml version="1.0" encoding="UTF-8"?>

<process name="task" xmlns="http://jbpm.org/4.3/jpdl">
   <start g="153,82,48,48" name="start1">
      <transition g="-44,-18" name="to task1" to="task1"/>
   </start>
   <end g="155,315,48,48" name="end1"/>
   <task candidate-groups="dev" g="131,188,92,52" name="task1">
      <transition g="-42,-18" name="to end1" to="end1"/>
   </task>
</process>

 

package com.family168;

import junit.framework.TestCase;
import org.jbpm.api.*;
import org.jbpm.api.task.*;
import java.util.*;

//task.jdpl.xml这个流程定义是想将一个组的任务给出来,用户可以进行竞争获取任务等的例子

public class TaskTest extends TestCase {
	ProcessEngine processEngine;

	public TaskTest() {
		processEngine = Configuration.getProcessEngine();
		//下面用了identity是身份验证,实际上它起来的就是组织机构的作用
		IdentityService identityService = processEngine.getIdentityService();
		identityService.createGroup("dev");//这里创建一个组
		//下面两行是添加用户
		identityService.createUser("user1", "user1", "user1");
		identityService.createUser("user2", "user2", "user3");
		//下面两行是将用户添加入组里去
		identityService.createMembership("user1", "dev");
		identityService.createMembership("user2", "dev");
	}

	public void testTask() {
		RepositoryService repositoryService = processEngine
				.getRepositoryService();
		TaskService taskService = processEngine.getTaskService();
		ExecutionService executionService = processEngine.getExecutionService();
		String deploymentId = repositoryService.createDeployment()
				.addResourceFromClasspath("task.jpdl.xml").deploy();
		//启动一个流程实例
		ProcessInstance processInstance = executionService
				.startProcessInstanceByKey("task");
		//用taskService.findGroupTasks()方法可以获得用户所在组的任务
		assertEquals(1, taskService.findGroupTasks("user1").size());
		assertEquals(1, taskService.findGroupTasks("user2").size());

		//获取用户所有所在组的任务
		List<Task> groupTaskList = taskService.findGroupTasks("user1");
		Task task = groupTaskList.get(0);//将第一个任务取出来
		taskService.takeTask(task.getId(), "user1");//user1接收第一个task任务
		taskService.completeTask(task.getId());//完成任务
	}
}

 

(4)定义事件流程定义,还是简单的流程:start ---> state1 ---> end,只是增加了事件的标记,可以在事件产生后,触发相应操作:

<?xml version="1.0" encoding="UTF-8"?>

<process name="event" xmlns="http://jbpm.org/4.3/jpdl">
	<on event="start">
		<event-listener class="com.family168.ProcessEventListener"/>
	</on>
	<on event="end">
		<event-listener class="com.family168.ProcessEventListener"/>
	</on>
	
	<start g="156,56,48,48" name="start1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<transition g="-49,-18" name="to state1" to="state1"/>
	</start>
	<state g="133,160,92,52" name="state1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<transition g="-42,-18" name="to end1" to="end1"/>
	</state>
	<end g="155,275,48,48" name="end1">
		<on event="start">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
		<on event="end">
			<event-listener class="com.family168.ProcessEventListener"/>
		</on>
	</end>
</process>

 

package com.family168;

import junit.framework.TestCase;

import org.jbpm.api.*;

public class EventTest extends TestCase {
	ProcessEngine processEngine;

	public EventTest() {
		processEngine = Configuration.getProcessEngine();
	}

	/*
	 * 我们可以分析出按even.jpdl.xml的配置文件所配的事件监听,因为有流程事件监听,那么开始启动流程实例就会触发流程启动事件
	 * 流程实例开始后会从start1开始,由于start1没有入度,即没有不会触发活动start1的start事件,但会行下执行,会触发它的end事件
	 * 流程实例会运行到state1并停在那里,所以会触发state1的start事件,但没有触发它的end事件
	 * 因此,共会触发三次事件,打印的结果也是这样
	 * 
	 */
	public void testDeploy() {
		RepositoryService repositoryService = processEngine.getRepositoryService();
		String deploymentId = repositoryService.createDeployment().addResourceFromClasspath("event.jpdl.xml").deploy();
		ExecutionService executionService = processEngine.getExecutionService();
		executionService.startProcessInstanceByKey("event");
		
	}
}

 

分享到:
评论

相关推荐

    JBMP入门讲解附带实例一个

    **JBMP入门详解与实践案例** JBMP,全称为Java Business Management Process,是早期的一种业务流程管理(Business Process Management)框架,主要用于企业级应用中处理业务流程自动化。它基于Java平台,提供了...

    jbmp入门教程,jBPM流程定义语言,业务日历,流程建模

    本教程将深入探讨jBMP的核心概念,包括流程定义语言、业务日历以及流程建模,帮助初学者快速入门。 一、jBPM流程定义语言 jBPM采用的是BPMN 2.0(Business Process Model and Notation)标准,这是一种图形化的流程...

    工作流初介绍EOS+JBMP入门

    在入门阶段,了解工作流的基本概念和JBPM的使用至关重要。"工作流基本知识介绍.doc"可能会涵盖工作流的定义、分类、生命周期、关键术语,以及如何在实践中应用工作流的概念。另一方面,"工作流基本概念及jbpm简介....

    jbmp开发入门指南

    **jbpm开发入门指南** **一、工作流与jbpm简介** 工作流技术在企业管理中起着关键作用,它能够自动化处理复杂的业务流程,提高工作效率。尽管目前尚无统一的标准,但工作流框架的需求日益增长,尤其是在需要多步骤...

    jbmp3.2学习笔记

    在jPDL中,与流程设计相关的文件有三个:processdefinition.xml、gdp.xml、processimage.jpg。其中processdefinition.xml是流程定义的描述文件;gpd.xml是对图形界面呈现的XML描述;而 processimage.jpg则是对图形...

    jBMP工作流开发入门指南

    【jBPM工作流开发入门指南】 jBPM(Java Business Process Management)是一个开源的工作流管理系统,用于构建和管理业务流程。它最初独立发展,后来成为JBoss组织的一部分。jBPM的设计目标是提供灵活、可扩展且...

    jboss+jbmp5.3开发手册.rar

    JBMP 5.3 版本是JBoss工作流管理系统的一个重要里程碑,它带来了许多增强功能和优化。这个开发手册将帮助开发者深入了解如何在JBoss环境中集成和使用JBM进行业务流程的管理和实现。 1. **JBM5.3.chm** - 这个CHM...

    chen-jbpm_websale.zip_jbmp_jbmp java_jbpm_jbpm_websale_网上销售系统

    这个压缩包是一个综合性的学习资源,不仅适合初学者入门,也对有一定经验的开发者有很高的参考价值。通过深入研究和实践,我们可以掌握如何利用JBPM构建和优化企业级的业务流程管理系统,特别是在电子商务领域。

    jbmp学习文档

    JBMP(Java Business Management Process)是Java业务流程管理的一种实现,它提供了一套框架用于定义、执行和监控业务流程。本文档将深入介绍JBPM5.1版本,帮助读者从入门到掌握其核心功能。 1. 简介 JBPM是开源的 ...

    jbmp用户指南.pdf

    第二章指导初学者如何入门,包括如何获取jBPM、配置预装的jboss应用服务器、设置jBPM数据库、以及部署示例流程。预配置的JBoss应用服务器包含了jBPM的核心组件、预集成的数据库、Web控制台、调度程序和命令执行器。 ...

    jBPM开发入门指南

    【标签】中的"源码"意味着我们将接触到jBPM的源代码层面,了解其内部工作机制,这对于深入理解jBMP和进行定制化开发至关重要。"工具"可能指的是与jBPM相关的开发工具和环境,如Eclipse BPMN2插件,用于图形化建模,...

    jbpm开发工具

    - 用户指南:详细介绍了如何安装、配置和使用jbpm,包括快速入门、高级特性以及常见问题解答。 - 开发者指南:针对开发者,涵盖了jbpm的API使用、流程建模、规则集成等方面的深入讲解。 - 参考手册:提供了各种类、...

    drools 5 Demo

    标签"JBMP5"表明《drools 5 Demo》基于Java Business Management Process 5版本,这意味着它与JBoss中间件平台紧密集成,可以充分利用JBoss提供的企业级服务,如事务管理、安全性和持久化等。这使得drools能够在大型...

    jbpm文档,Jbpm 帮助

    ### jBPM技术知识点概述 #### 一、jBPM简介 - **定义与起源**:jBPM(Java Business Process Model)...以上是对jBPM文档的主要内容进行了详细的介绍,涵盖了从入门到进阶的各个方面,为开发者提供了全面的技术支持。

Global site tag (gtag.js) - Google Analytics