需要引入的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; -- 所有活动的历史表(包括开始结束节点)