JBPM开发流程实例
上一篇文章说了JBPM的安装和配置,现在开始第一个流程的开发
1.将JBPM自带的example项目引进来,并将JBPM相应的jar包添加到classpath,在src目录下新建jBPM 4 Process Defination,命名为processTest.jpdl.xml,内容如下:
<?xml version="1.0" encoding="UTF-8"?>
<process name="processTest" xmlns="http://jbpm.org/4.3/jpdl">
<start name="start" g="145,32,80,58">
<transition name="to state" to="state" g="-59,-17"/>
</start>
<state name="state" g="131,117,67,59">
<transition name="to task" to="task" g="-53,-17"/>
</state>
<task name="task" g="141,203,77,64" assignee="Alex">
<transition name="to end" to="end" g="-47,-17"/>
</task>
<end name="end" g="139,302,77,56"/>
</process>
当然你也可以通过可视化编辑器去设计
2.部署流程,即把流程定义对象持久化到数据库,大体步骤如下:
a.引入mysql驱动
b.修改hibernate.cfg.xml
c.创建JBPM所用到的数据库表
d.根据流程定义文件,解释得到流程定义对象,把流程定义持久化到数据库
修改jbpm.hibernate.cfg.xml,内容如下
<property name="hibernate.dialect">org.hibernate.dialect.MySQLInnoDBDialect</property>
<property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property>
<property name="hibernate.connection.url">jdbc:mysql://127.0.0.1:3306/jbpm</property>
<property name="hibernate.connection.username">root</property>
<property name="hibernate.connection.password">你的mysql密码</property>
<!-- <property name="hibernate.hbm2ddl.auto">create</property> -->
<property name="hibernate.format_sql">true</property>
由于我使用的是mysql,将对应的值进行修改,如果你的mysql引擎使用的是InnoDB那么方言应该需要是MySQLInnoDBDialect,引擎和方言要对应,否则在流程执行结束的时候会出现该问题,当然首先应该新建一个库名叫jbpm, <property name="hibernate.hbm2ddl.auto">create</property>系统第一次运行的时候要进行相关表的创建,第一次过后可以注释,以免每次运行都会重新创建新的表。
3.流程定义部署和流程实例测试
a.部署流程定义
public static void deployProcess(String processName) {
//1、创建JBPM配置对象
Configuration configuration = new Configuration();
//2、创建流程引擎
ProcessEngine processEngine = configuration.buildProcessEngine();
//3、获得数据仓库服务对象
RepositoryService repositoryService = processEngine.getRepositoryService();
//4、创建部署实例对象
NewDeployment newDeployment = repositoryService.createDeployment();
//5、从类路径下面增加流程部署文件到部署实例对象
newDeployment = newDeployment.addResourceFromClasspath(processName);
//6完成流程的部署
String processNameString = newDeployment.deploy();
System.out.println(processNameString);
}
b.流程实例新建测试
Configuration config = new Configuration();
ProcessEngine engine = config.buildProcessEngine();
ExecutionService executionService = engine.getExecutionService();
//使用执行服务,根据已经部署的流程定义的名称processTest,发起流程实例
ProcessInstance processInstance = executionService.startProcessInstanceByKey("processTest");
//获取流程实例ID
String pid = processInstance.getId();
System.out.println("流程实例ID为" + pid);
//获取当前活动的执行对象
Execution executionState = processInstance.findActiveExecutionIn("state");
//使用执行服务,发出执行信号结束当前活动,继续流程的执行
executionService.signalExecutionById(executionState.getId());
//使用执行服务,从持久化层中获取"最新"的流程实例对象
processInstance = executionService.findProcessInstanceById(pid);
//获取当前活动的执行对象
Execution executionTask = processInstance.findActiveExecutionIn("task");
TaskService taskService = engine.getTaskService();
//使用任务服务,获取用户Alex的任务,即task活动产生的任务,简单来说就是某个人的待办信息
Task task = taskService.findPersonalTasks("Alex").get(0);
//使用任务服务,完成任务
taskService.completeTask(task.getId());
//使用历史服务,创建历史任务查询
HistoryService historyService = engine.getHistoryService();
HistoryTask historyTask = historyService.createHistoryTaskQuery().taskId(task.getId()).uniqueResult();
String assignee = historyTask.getAssignee();
System.out.println("assignee的值为" + assignee);
//使用历史服务来创建历史流程实例查询
HistoryProcessInstance historyProcessInstance = historyService.createHistoryProcessInstanceQuery().processInstanceId(pid).uniqueResult();
System.out.println("历史流程实例的id为" + historyProcessInstance.getProcessInstanceId());
如果控制台不报错且相应信息打印出来则测试成功

浙公网安备 33010602011771号