本文已收录在Github,关注我,紧跟本系列专栏文章,咱们下篇再续!
- 🚀 魔都架构师 | 全网30W技术追随者
 - 🔧 大厂分布式系统/数据中台实战专家
 - 🏆 主导交易系统百万级流量调优 & 车联网平台架构
 - 🧠 AIGC应用开发先行者 | 区块链落地实践者
 - 🌍 以技术驱动创新,我们的征途是改变世界!
 - 👉 实战干货:编程严选网
 
0 目标
Java项目集成 Activiti7 完成一个简单工作流。
1 添加依赖
添加Activiti7依赖:
<dependency>
    <groupId>org.activiti</groupId>
    <artifactId>activiti-spring-boot-starter</artifactId>
    <version>7.1.0.M4</version>
</dependency>
<dependency>
    <groupId>org.activiti.dependencies</groupId>
    <artifactId>activiti-dependencies</artifactId>
    <version>7.1.0.M4</version>
    <type>pom</type>
</dependency>
2 Activiti7经典类
- 任务处理Task
 - 历史任务HistoricTaskInstance:代表一个历史悠久的任务实例(等待,完成或删除),该实例被存储为统计,审计和其他商业智能目的的永久存储
 - 流程部署Deployment
 - 流程定义ProcessDefinition
 - 流程实例Processlnstance
 
3 流程部署Deployment
// 通过bpmn部署流程
@Test
public void initDeploymentBPMN() {
    String filename = "BPMN/Part4_Task_claim.bpmn";
    Deployment deployment = repoService.createDeployment()
            .addClasspathResource(filename)
            .name("流程部署测试候选人task")
            .deploy();
    System.out.println(deployment.getName());
}
看到表里刚创的数据ACT_RE_DEPLOYMENT:
二进制文件保存的表ACT_GE_BYTEARRAY:
咋让别人看到你画的图?
同时生成一个图片即可。但其实.bpmn文件就能用bpmn.js插件渲染出来了。
//通过bpmn部署流程
@Test
public void initDeploymentBPMN() {
    String filename = "BPMN/Part4_Task_claim.bpmn";
     String pngname="BPMN/Part1_Deployment.png";
    Deployment deployment = repoService.createDeployment()
            .addClasspathResource(filename)
            .addClasspathResource(pngname)//图片
            .name("流程部署测试V1")
            .deploy();
    System.out.println(deployment.getName());
}
这就说明同属于一个部署:
部署一个 zip
//通过ZIP部署流程
@Test
public void initDeploymentZIP() {
    InputStream fileInputStream = this.getClass()
            .getClassLoader()
            .getResourceAsStream("BPMN/Part1_DeploymentV2.zip");
    ZipInputStream zip = new ZipInputStream(fileInputStream);
    Deployment deployment = repoService.createDeployment()
            .addZipInputStream(zip)
            .name("流程部署测试zip")
            .deploy();
    System.out.println(deployment.getName());
}
最终生成的是什么呢?没错,zip 里的 两个文件,同属于一个部署:
4 流程定义ProcessDefinition
和 deploymentid 其实一对一:(ID_ 就是 key+部署次数版本+id)
既不是因为表的字段太多,也不是因为一对多,就是设计成了一对一关系。
查询流程定义
@Test
public void getDefinitions() {
    List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery()
            .list();
    for (ProcessDefinition pd : list) {
        System.out.println("------流程定义--------");
        System.out.println("Name:" + pd.getName());
        System.out.println("Key:" + pd.getKey());
        System.out.println("ResourceName:" + pd.getResourceName());
        System.out.println("DeploymentId:" + pd.getDeploymentId());
        System.out.println("Version:" + pd.getVersion());
    }
}
删除流程定义
@Test
public void delDefinition() {
    String pdID = "44b15cfe-ce3e-11ea-92a3-dcfb4875e032";
    repositoryService.deleteDeployment(pdID, true);
    System.out.println("删除流程定义成功");
}
- Deployment:添加资源文件、获取部署信息、部署时间
 - ProcessDefinition:获取版本号、 key、资源名称、部署ID等
 
5 流程实例ProcessInstance
ProcessDefinition与ProcessInstance是一对多关系,理解为:行动计划与具体行动的关系。
5.1 初始化流程实例
需要的就是一个流程的 key:
@Test
public void initProcessInstance(){
    // 1、获取页面表单填报的内容,请假时间,请假事由,String fromData
    // 2、fromData 写入业务表,返回业务表主键ID==businessKey
    // 3、把业务数据与Activiti7流程数据关联
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_claim","bKey002");
    System.out.println("流程实例ID:"+processInstance.getProcessDefinitionId());
}
5.2 获取流程实例列表
// 
@Test
public void getProcessInstances(){
    List<ProcessInstance> list = runtimeService.createProcessInstanceQuery().list();
    for(ProcessInstance pi : list){
        System.out.println("--------流程实例------");
        System.out.println("ProcessInstanceId:"+pi.getProcessInstanceId());
        System.out.println("ProcessDefinitionId:"+pi.getProcessDefinitionId());
        System.out.println("isEnded"+pi.isEnded());
        System.out.println("isSuspended:"+pi.isSuspended());
    }
}
5.3 暂停与激活流程实例
@Test
public void activitieProcessInstance(){
    // runtimeService.suspendProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
    //System.out.println("挂起流程实例");
    runtimeService.activateProcessInstanceById("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032");
    System.out.println("激活流程实例");
}
5.4 删除流程实例
@Test
public void delProcessInstance(){
    runtimeService.deleteProcessInstance("73f0fb9a-ce5b-11ea-bf67-dcfb4875e032","删着玩");
    System.out.println("删除流程实例");
}
6 任务
6.1 任务的类型
任务的图形化是以矩形为基础,在左侧添加具体的图标,用来描述一种特定任务类型。
用户任务需要人来参与,需要人为触发。
6.2 关键属性
关注用户任务:
- Assignee:执行人/代理人
 - Candidate Users:候选人 谁先拾取任务,谁来执行任务
 - Candidate Groups:候选组
 - Due Date:任务到期时间
 
下面串起这些概念:
7 报销流程设计
7.1 bpmn设计
猪头三发起了报销请求:
JavaEdge 审核报销请求:
注意流程 id 名为:myProcess_Task,
7.2 bpmn部署
先bpmn部署该流程:
public void startDeploymentBPMN() {
    String filename = "BPMN/Part4_Task.bpmn";
    Deployment deployment = repoService.createDeployment()
            .addClasspathResource(filename)
            .name("Part4_Task")
            .deploy();
}
7.3 启动流程
再启动一个这样的流程实例:
public void initProcessInstance(){
    ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("myProcess_Task","bKey002");
}
最后,我们来查询任务执行情况:
7.4 任务查询
@Test
public void getTasks(){
    List<Task> list = taskService.createTaskQuery().list();
    for(Task tk : list){
        System.out.println("Id:"+tk.getId());
        System.out.println("Name:"+tk.getName());
        System.out.println("Assignee:"+tk.getAssignee());
    }
}
output:
Id:9ec8d75e-9b86-11ef-8c93-a202cf5d45d9
Name:发起报销
Assignee:猪头三
该全量任务列表方法一般是由管理员查看任务执行情况。
查询我的代办任务
@Test
public void getTasksByAssignee(){
    List<Task> list = taskService.createTaskQuery()
            .taskAssignee("猪头三")
            .list();
    for(Task tk : list){
        System.out.println("Id:"+tk.getId());
        System.out.println("Name:"+tk.getName());
        System.out.println("Assignee:"+tk.getAssignee());
    }
}
output:
Id:9ec8d75e-9b86-11ef-8c93-a202cf5d45d9
Name:发起报销
Assignee:猪头三
配置流程引擎
创建一个 ProcessEngineConfiguration 实例来初始化流程引擎:
import org.activiti.engine.ProcessEngine;
import org.activiti.engine.ProcessEngineConfiguration;
public class ActivitiConfig {
    public static ProcessEngine buildProcessEngine() {
        ProcessEngineConfiguration config = ProcessEngineConfiguration
                .createStandaloneInMemProcessEngineConfiguration();
        config.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
        config.setJdbcUrl("jdbc:h2:mem:activiti;DB_CLOSE_DELAY=1000");
        config.setJdbcDriver("org.h2.Driver");
        config.setJdbcUsername("sa");
        config.setJdbcPassword("");
        return config.buildProcessEngine();
    }
}
上面的代码创建了一个内存数据库中的流程引擎配置,这在开发和测试阶段非常便捷。
点击查看更多内容
					为 TA 点赞
										
				 评论
				共同学习,写下你的评论
评论加载中...
作者其他优质文章
					正在加载中
				
			感谢您的支持,我会继续努力的~
		扫码打赏,你说多少就多少
		赞赏金额会直接到老师账户
		支付方式
		打开微信扫一扫,即可进行扫码打赏哦
	
                
            









