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");
		
	}
}

 

你可能感兴趣的:(xml,工作,JUnit,配置管理,jbpm)