少说多做
梦想只有在脚踏实地的工作中才能得以实现。积极主动地去找事做,一步一个脚印得去完成任务,要没有任何怨言,会主动包揽其他任务。只有实干,只有付诸行动,离线的风帆才会鼓足力量,人生的帆船才能驶向成功的彼岸。
实干才是最真,行动胜于空谈。少空谈,多做事,能实干,能行动,是一个人品行、修养的体现。
第二篇:JBMP入门 少说谢漂亮的话,多做些平凡的事
少说谢漂亮的话,多做些平凡的事
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");
}
}