一、使用的相關開發工具軟件。java
1)Eclipse IDE for Java EE Developers(Eclipse 4.2)mysql
2)jBPM4.4sql
3)MySQL5.5數據庫
二、配置在Eclipse中設計流程的gpd插件。api
1)gpd插件所在目錄:jbpm-4.4\install\src\gpd\jbpm-gpd-site.zipsession
2)安裝插件:Eclipse菜單 Help-->Install New Softwore...打開Install窗口;在Install窗口點擊 Add...打開Add Repository窗口;在Add Repository窗口點擊Archive...在插件所在目錄選擇jbpm-gpd-site.zip。
app
3)安裝完成會提示是否重啓Eclipse,選擇重啓。ide
三、配置jBPM的Runtime Locations。
工具
1)Eclipse菜單 Window-->Preferences-->JBoss jBPM-->Runtime Locations
單元測試
2)在Runtime Locations窗口點擊Add...打開Add Location窗口,Name:起個名字,如jBPM4.4;Location:選擇jBPM4.4的解壓安裝目錄。
四、使用單元測試實現First jBPM4。
1)新建一個Java Project,取名FirstJBPM4。
2)把jbpm-4.4\jbpm.jar和jbpm-4.4\lib下的全部jar文件添加到項目的classpath路徑下。(或者把jBPM4.4的全部jar配置成一個User Library,而後在項目中直接引用)
3)把jbpm-4.4\examples\src目錄下的jbpm.cfg.xml、jbpm.hibernate.cfg.xml和logging.properties加入到項目的src目錄下。
4)FirstJBPM4項目結構以下。
5)修改jbpm.hibernate.cfg.xml文件,配置數據庫相關信息。
<?xml version="1.0" encoding="utf-8"?><!DOCTYPE hibernate-configuration PUBLIC "-//Hibernate/Hibernate Configuration DTD 3.0//EN" "http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"><hibernate-configuration> <session-factory> <!-- 數據庫信息 --> <property name="hibernate.dialect">org.hibernate.dialect.MySQL5InnoDBDialect</property> <property name="hibernate.connection.driver_class">com.mysql.jdbc.Driver</property> <property name="hibernate.connection.url">jdbc:mysql://localhost:3306/jbpm4</property> <property name="hibernate.connection.username">root</property> <property name="hibernate.connection.password">root</property> <!-- 其餘配置 --> <property name="hibernate.show_sql">false</property> <property name="hibernate.hbm2ddl.auto">update</property> <!-- 映射文件 --> <mapping resource="jbpm.repository.hbm.xml" /> <mapping resource="jbpm.execution.hbm.xml" /> <mapping resource="jbpm.history.hbm.xml" /> <mapping resource="jbpm.task.hbm.xml" /> <mapping resource="jbpm.identity.hbm.xml" /> </session-factory></hibernate-configuration>
6)在MySQL中創建一個數據庫叫jbpm4。
create database jbpm4 default character set utf8;
7)在項目名稱上點擊右鍵New-->Source Folder,取名process。process和src是同級的,在process下存放流程定義文件。
8)設計請假流程定義文件。在process下創建一個Package叫leave,而後leave上點擊右鍵New-->jBPM Process Definition,取名Leave。
9)畫流程圖,用assignee分配相應的任務處理人員。
Leave.jpdl.xml文件以下
<?xml version="1.0" encoding="UTF-8"?><process name="Leave" xmlns="http://jbpm.org/4.4/jpdl"> <start name="start1" g="303,8,48,48"> <transition name="to 提出申請" to="提出申請" g="-67,-20"/> </start> <end name="end1" g="303,340,48,48"/> <task name="提出申請" g="281,88,92,52" assignee="[員工]小李"> <transition name="to 部門經理審批" to="部門經理審批" g="-91,-20"/> </task> <task name="部門經理審批" g="281,172,92,52" assignee="[部門經理]李總"> <transition name="to 總經理審批" to="總經理審批" g="-79,-20"/> </task> <task name="總經理審批" g="281,256,92,52" assignee="[總經理]張總"> <transition name="to end1" to="end1" g="-45,-20"/> </task></process>
整個流程就是:[員工]小李提出申請--》[部門經理]李總審批--》[總經理]張總審批。
10)單元測試代碼。
package cn.luxh.jbpm4;import java.util.List;import org.jbpm.api.Configuration;import org.jbpm.api.ProcessEngine;import org.jbpm.api.ProcessInstance;import org.jbpm.api.task.Task;import org.junit.Test;public class JBPM4Test { //創建jBPM4.4的數據庫表 @Test public void testCreateSchema() { new org.hibernate.cfg.Configuration().configure("jbpm.hibernate.cfg.xml").buildSessionFactory(); } //流程引擎,經過流程引擎獲取各類服務接口 private ProcessEngine processEngine = Configuration.getProcessEngine(); //部署流程定義 @Test public void testDeployProcessDefinition() { processEngine.getRepositoryService() .createDeployment() .addResourceFromClasspath("leave/Leave.jpdl.xml") .addResourceFromClasspath("leave/Leave.png").deploy(); } //啓動流程實例 @Test public void testStartProcessInstance() { ProcessInstance processInstance = processEngine.getExecutionService().startProcessInstanceByKey("Leave"); System.out.println("processInstance id is:"+processInstance.getId()); System.out.println("processInstance key is:"+processInstance.getKey()); System.out.println("processInstance name is:"+processInstance.getName()); } //查找用戶待辦任務 @Test public void testFindTasksByUserId() { String userId = "[員工]小李"; //String userId = "[部門經理]李總"; //String userId = "[總經理]張總"; List<Task> tasks = processEngine.getTaskService().findPersonalTasks(userId); for(Task task : tasks) { System.out.println("當前處理人:"+task.getAssignee()+" 當前任務:"+task.getName()); } } //處理待辦 @Test public void testCompleteTask() { String userId = "[員工]小李"; //String userId = "[部門經理]李總"; //String userId = "[總經理]張總"; List<Task> tasks = processEngine.getTaskService().findPersonalTasks(userId); for(Task task : tasks) { processEngine.getTaskService().completeTask(task.getId()); } } }