需要引入的POM依賴
<!-- activiti依賴包 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-engine</artifactId>
<version>5.21.0</version>
</dependency>
<!-- 整合Spring使用的Jar包 -->
<dependency>
<groupId>org.activiti</groupId>
<artifactId>activiti-spring</artifactId>
<version>5.21.0</version>
</dependency>
1、創建工作流 25張表
// 創建表
@Test
public void createTable() {
// 實例化流程對象
ProcessEngineConfiguration pec = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
// 初始化數據庫連接
pec.setJdbcDriver("oracle.jdbc.driver.OracleDriver");
pec.setJdbcUrl("jdbc:oracle:thin:@127.0.0.1:1521:orcl");
pec.setJdbcUsername("oa");
pec.setJdbcPassword("oa");
/**
* DB_SCHEMA_UPDATE_FALSE : 不能自動創建表, 需要表存在
* DB_SCHEMA_UPDATE_TRUE : 如果表不存在,自動創建表
* DB_SCHEMA_UPDATE_CREATE_DROP : 先刪除表再創建表
*/
pec.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
// 工作流核心對象
ProcessEngine processEngine = pec.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
2、 通過配置文件,創建工作流所需要的25張表
activiti.cfg.xml 文件
<bean id="processEngineConfiguration" class="org.activiti.engine.impl.cfg.StandaloneProcessEngineConfiguration">
<property name="jdbcDriver" value="oracle.jdbc.driver.OracleDriver"></property>
<property name="jdbcUrl" value="jdbc:oracle:thin:@127.0.0.1:1521:orcl"></property>
<property name="jdbcUsername" value="oa"></property>
<property name="jdbcPassword" value="oa"></property>
<property name="databaseSchemaUpdate" value="true"></property>
</bean>
// 通過配置文件,創建流程引擎需要的25張表
@Test
public void createTableByConfig() {
// 實例化流程對象
ProcessEngineConfiguration pec = ProcessEngineConfiguration.createProcessEngineConfigurationFromResource("activiti.cfg.xml");
// 工作流核心對象
ProcessEngine processEngine = pec.buildProcessEngine();
System.out.println("processEngine:"+processEngine);
}
3、簡單的流程配置
/**
* 工作流入門實例
* @author PL
*
*/
public class HelloWord {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 部署流程定義
@Test
public void deploymentProcessDefine() {
Deployment deployMent = processEngine.getRepositoryService()
.createDeployment() // 創建流程部署對象
.name("01流程定義")
.addClasspathResource("diagrams/FirstTask.bpmn")
.addClasspathResource("diagrams/FirstTask.png")
.deploy(); // 完成部署
System.out.println(deployMent.getId()); // 01
System.out.println(deployMent.getName()); // 01流程定義
System.out.println(JSON.toJSON(deployMent));
}
// 啓動流程實例
@Test
public void startProcessInstance() {
String key = "helloword";
ProcessInstance pi = processEngine.getRuntimeService()
.startProcessInstanceByKey(key);
System.out.println(pi.getId()); // 2501
System.out.println(pi.getProcessDefinitionId()); //helloword:1:4
System.out.println(JSON.toJSONString(pi));
}
// 查詢當前人的個人任務
@Test
public void findMyPersonTask() {
String assign = "李四";
List<Task> list = processEngine.getTaskService()
.createTaskQuery()
.taskAssignee(assign)
.list();
if(null != list && list.size()>0) {
for (Task task : list) {
System.out.println("任務id:"+task.getId()); // 2504
System.out.println("任務辦理人:"+task.getAssignee());
System.out.println("任務名稱:"+task.getName());
System.out.println("任務創建時間:"+task.getCreateTime());
System.out.println("流程實例:"+task.getProcessInstanceId()); //2501
System.out.println("執行對象Id:"+task.getExecutionId()); //2501
}
}
}
// 完成我的任務
@Test
public void finishMyTask() {
String taskId = "2504";
processEngine.getTaskService()
.complete(taskId);
System.out.println("完成任務,任務ID:"+taskId); // 2504
}
}
4、流程定義詳解
/**
* 流程定義Test
* @author Pl
*
*/
public class ProcessDefinitionTest {
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
/**
* 部署流程定義
* ACT_RE_DEPLOYMENT 部署對象表 ,部署的對象簡要信息
* ACT_RE_PROCDEF 流程定義表 , 裏面包含部署Id, key , version
* ACT_GE_BYTEARRAY : 資源文件表
*/
@Test
public void deploymentProcessDefine() {
Deployment deployMent = processEngine.getRepositoryService()
.createDeployment() // 創建流程部署對象
.name("流程定義")
.addClasspathResource("diagrams/FirstTask.bpmn")
.addClasspathResource("diagrams/FirstTask.png")
.deploy(); // 完成部署
System.out.println(deployMent.getId()); // 01 //7501
System.out.println(deployMent.getName()); // 01流程定義
System.out.println(JSON.toJSON(deployMent));
}
/**
* 查詢流程定義
*/
@Test
public void findProcessDefined() {
List<ProcessDefinition> list = processEngine.getRepositoryService()
.createProcessDefinitionQuery()
// .deploymentId(deploymentId) // 部署對象Id查詢
// .processDefinitionId(processDefinitionId) //流程定義Id
// .processDefinitionKey(processDefinitionKey) // 流程定義Key
// .processDefinitionKeyLike("") // 模糊查詢
// .orderByDeploymentId().desc(); // 排序
.list(); // 返回一個集合
// .singleResult(); // 返回唯一結果值
// .listPage(firstResult, maxResults); // 分頁查詢
if(null != list) {
for (ProcessDefinition processDefinition : list) {
System.out.println("流程定義Id"+processDefinition.getId());
System.out.println("流程定義名稱"+processDefinition.getName()); // 對應.bpmn中的name屬性
System.out.println("流程定義Key"+processDefinition.getKey()); // 對應.bpmn中 id
System.out.println("流程定義版本"+processDefinition.getVersion()); //相同Key , 版本升級
}
}
}
/**
* 刪除流程定義
*/
@Test
public void deleteProcessDefined() {
String deploymentId = "1";
processEngine.getRepositoryService()
// .deleteDeployment(deploymentId); // 不能級聯刪除,只能刪除沒有啓動的流程,如果啓動,拋出異常
.deleteDeployment(deploymentId,true); // 級聯刪除, 強制刪除
System.out.println("刪除成功");
}
// 導入zip 文件
@Test
public void deploymentProcessDefinition_zip() {
InputStream in = this.getClass().getClassLoader()
.getResourceAsStream("diagrams/helloworld.zip");
ZipInputStream zipInputStream = new ZipInputStream(in);
Deployment deployment = processEngine.getRepositoryService()// 與流程定義和部署對象相關的service
.createDeployment()// 創建一個部署對象
.name("流程定義")// 添加部署
.addZipInputStream(zipInputStream)// 指定zip格式的文件完成部署
.deploy();// 完成部署
System.out.println("部署ID:" + deployment.getId());
System.out.println("部署名稱:" + deployment.getName());
}
}
流程處理中的表的介紹
select * from ACT_RE_DEPLOYMENT; -- 流程部署表
select * from ACT_RE_PROCDEF; -- 流程定義表
---------------------------------------------------
select * from ACT_RU_EXECUTION; --正在執行的執行對象表(沒有每節點時,執行對象id與實例id一致)
select * from ACT_HI_PROCINST; -- 流程實例歷史表(流程執行的歷史)
select * from ACT_RU_TASK; -- 正在執行的任務表(只有usertask 纔會顯示)
select * from ACT_HI_TASKINST; -- 任務歷史表(同上)
select * from ACT_HI_ACTINST; -- 所有活動的歷史表(包括開始結束節點)