万字详解:Activiti 工作流引擎(二)

简介: 万字详解:Activiti 工作流引擎(二)

4. Activiti架构简介

activiti.cfg.xml activiti 的引擎配置文件,包括:ProcessEngineConfiguration 的定义、数据源定义、事务管理器等,此文件其实就是一个 spring 配置文件,下面是一个基本的配置只配置了 ProcessEngineConfiguration和数据源。

ProcessEngineConfiguration 流程引擎的配置类,通过 ProcessEngineConfiguration 可以创建工作流引擎 ProceccEngine,常用的两种方法。

ProcessEngine 工作流引擎,相当于一个门面接口,通过 ProcessEngineConfiguration 创建 processEngine,通过ProcessEngine 创建各个 service 接口。

Service 通过ProcessEngine 创建 Service, Service 是工作流引擎提供用于进行工作流部署、执行、管理的服务接口。

微信图片_20220907165006.png

5. Activiti入门案例

5.1 流程定义

什么是流程定义流程定义是线下按照 bpmn2.0 标准去描述 业务流程,通常使用 activiti-explorer(web 控制台)或 activiti-eclipse-designer 插件对业务流程进行建模,这两种方式都遵循 bpmn2.0 标准。本教程使用activiti-eclipse-designer 插件完成流程建模。使用 designer 设计器绘制流程,会生成两个文件:.bpmn和.png

创建bpmn文件Palette(画板)

在 eclipse 或 idea 中安装 activiti-designer 插件即可使用,画板中包括以下结点:
Connection—连接
Event---事件
Task---任务
Gateway---网关
Container—容器
Boundary event—边界事件
Intermediate event- -中间事件
流程图设计完毕保存生成.bpmn 文件

idea创建bpmn

微信图片_20220907165037.png

微信图片_20220907165040.png

生成png图片第一步:将 holiday.bpmn 文件改为扩展名 xml 的文件名称:holiday.xml 第二步:在 holiday.xml 文件上面,点右键并选择 Diagrams 菜单,再选择 Show BPMN2.0 Designe

微信图片_20220907165112.png

第三步:打开后的效果图如下:

微信图片_20220907165129.png

打开如下窗口,注意填写文件名及扩展名,选择好保存图片的位置:

微信图片_20220907165144.png

第五步:中文乱码的解决1、 打开IDEA安装路径,找到如下的安装目录;

微信图片_20220907165158.png

根据自己所安装的版本来决定,我使用的是 64 位的 idea,所以在 idea64.exe.vmoptions 文件的最后 一行追加一条命令:-Dfile.encoding=UTF-8 如下所示

微信图片_20220907165225.png

一定注意,不要有空格,否则重启 IDEA 时会打不开,然后 重启 IDEA,把原来的 png 图片删掉,再重新生成,即可解决乱码问题

5.2 部署流程

什么是流程部署将线下定义的流程部署到 activiti 数据库中,这就是流程定义部署,通过调用 activiti 的 api 将流程定义的 bpmn 和 png 两个文件一个一个添加部署到 activiti 中,也可以将两个文件打成 zip 包进行部署。

单个文件部署方式分别将bpmn 文件和 png 图片文件部署 压缩包部署方式

/**
 * 流程定义的部署
 * activiti表有哪些?
 * act_re_deployment  部署信息
 * act_re_procdef     流程定义的一些信息
 * act_ge_bytearray   流程定义的bpmn文件及png文件
 *
 * @author zrj
 * @date 2020/12/29
 * @since V1.0
 **/
public class ActivitiDeployment {
    /**
     * 方式一
     * 分别将 bpmn 文件和 png 图片文件部署
     */
    @Test
    public void activitiDeploymentTest() {
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addClasspathResource( "diagram/holiday.bpmn" )
                .addClasspathResource( "diagram/holiday.png" )
                .name( "请假申请单流程" )
                .deploy();
        //4.输出部署的一些信息
        System.out.println( deployment.getName() );
        System.out.println( deployment.getId() );
    }
    /**
     * 方式二
     * 将 holiday.bpmn 和 holiday.png 压缩成 zip 包
     */
    @Test
    public void activitiDeploymentTest2() {
        //1.创建ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RepositoryService实例
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //3.转化出ZipInputStream流对象
        InputStream is = ActivitiDeployment.class.getClassLoader().getResourceAsStream( "diagram/holidayBPMN.zip" );
        //将 inputstream流转化为ZipInputStream流
        ZipInputStream zipInputStream = new ZipInputStream( is );
        //3.进行部署
        Deployment deployment = repositoryService.createDeployment()
                .addZipInputStream( zipInputStream )
                .name( "请假申请单流程" )
                .deploy();
        //4.输出部署的一些信息
        System.out.println( deployment.getName() );
        System.out.println( deployment.getId() );
    }
}

操作数据表

-- activiti表有哪些?
 -- 部署信息
select * from act_re_deployment ;
-- 流程定义的一些信息
select * from act_re_procdef;
 -- 流程定义的bpmn文件及png文件
select * from act_ge_bytearray;

5.3 启动流程

/**
 * 启动流程实例:
 * 前提是先已经完成流程定义的部署工作
 * 背后影响的表:
 * act_hi_actinst     已完成的活动信息
 * act_hi_identitylink   参与者信息
 * act_hi_procinst   流程实例
 * act_hi_taskinst   任务实例
 * act_ru_execution   执行表
 * act_ru_identitylink   参与者信息
 * act_ru_task  任务
 *
 * @author zrj
 * @date 2020/12/29
 * @since V1.0
 **/
public class ActivitiStartInstance {
    public static void main(String[] args) {
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        //2.得到RunService对象
        RuntimeService runtimeService = processEngine.getRuntimeService();
        //3.创建流程实例  流程定义的key需要知道 holiday
        ProcessInstance processInstance = runtimeService.startProcessInstanceByKey( "holiday" );
        //4.输出实例的相关信息
        System.out.println( "流程部署ID" + processInstance.getDeploymentId() );
        System.out.println( "流程定义ID" + processInstance.getProcessDefinitionId() );
        System.out.println( "流程实例ID" + processInstance.getId() );
        System.out.println( "活动ID" + processInstance.getActivityId() );
    }
}

5.4 流程定义查询

/**
 * 流程定义查询
 *
 * @author zrj
 * @date 2020/12/29
 * @since V1.0
 **/
public class QueryProceccDefinition {
    @Test
    public void queryProceccDefinition() {
        // 流程定义key
        String processDefinitionKey = "holiday";
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 查询流程定义
        ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
        //遍历查询结果
        List<ProcessDefinition> list = processDefinitionQuery
                .processDefinitionKey( processDefinitionKey )
                .orderByProcessDefinitionVersion().desc().list();
        for (ProcessDefinition processDefinition : list) {
            System.out.println( "------------------------" );
            System.out.println( " 流 程 部 署 id : " + processDefinition.getDeploymentId() );
            System.out.println( "流程定义id: " + processDefinition.getId() );
            System.out.println( "流程定义名称: " + processDefinition.getName() );
            System.out.println( "流程定义key: " + processDefinition.getKey() );
            System.out.println( "流程定义版本: " + processDefinition.getVersion() );
        }
    }
}

5.5 流程定义删除

/**
     * 删除指定流程id的流程
     */
    public void deleteDeployment() {
        // 流程部署id
        String deploymentId = "8801";
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 通过流程引擎获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        //删除流程定义, 如果该流程定义已有流程实例启动则删除时出错
        repositoryService.deleteDeployment( deploymentId );
        //设置true 级联删除流程定义,即使该流程有流程实例启动也可以删除,设
        //置为false非级别删除方式,如果流程
        repositoryService.deleteDeployment( deploymentId, true );
    }

5.6 流程定义资源查询

/**
     * 获取资源
     */
    @Test
    public void getProcessResources() throws IOException {
        // 流程定义id
        String processDefinitionId = "";
        //1.得到ProcessEngine对象
        ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
        // 获取repositoryService
        RepositoryService repositoryService = processEngine.getRepositoryService();
        // 流程定义对象
        ProcessDefinition processDefinition = repositoryService
                .createProcessDefinitionQuery()
                .processDefinitionId( processDefinitionId ).singleResult();
        //获取bpmn
        String resource_bpmn = processDefinition.getResourceName();
        //获取png
        String resource_png = processDefinition.getDiagramResourceName();
        // 资源信息
        System.out.println( "bpmn: " + resource_bpmn );
        System.out.println( "png: " + resource_png );
        File file_png = new File( "d:/purchasingflow01.png" );
        File file_bpmn = new File( "d:/purchasingflow01.bpmn" );
        // 输出bpmn
        InputStream resourceAsStream = null;
        resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_bpmn );
        FileOutputStream fileOutputStream = new FileOutputStream( file_bpmn );
        byte[] b = new byte[1024];
        int len = -1;
        while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) {
            fileOutputStream.write( b, 0, len );
        }
        // 输出图片
        resourceAsStream = repositoryService.getResourceAsStream( processDefinition.getDeploymentId(), resource_png );
        fileOutputStream = new FileOutputStream( file_png );
        // byte[] b = new byte[1024];
        // int len = -1;
        while ((len = resourceAsStream.read( b, 0, 1024 )) != -1) {
            fileOutputStream.write( b, 0, len );
        }
    }
相关文章
|
存储 数据安全/隐私保护 Windows
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
Windows 命令提示符(CMD)操作(五):磁盘和磁盘操作
|
安全 Java 关系型数据库
Spring boot整合Activiti7
Spring boot整合Activiti7
3953 0
Spring boot整合Activiti7
|
XML 数据可视化 Java
非常轻量、高性能、可集成、可扩展的流程引擎compileflow
compileflow Process引擎是淘宝工作流TBBPM引擎之一,是专注于纯内存执行,无状态的流程引擎,通过将流程文件转换生成java代码编译执行,简洁高效。当前是阿里业务中台交易等多个核心系统的流程引擎。
|
12月前
|
Oracle 关系型数据库 Java
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
本文介绍通过Flink CDC实现Oracle数据实时同步至崖山数据库(YashanDB)的方法,支持全量与增量同步,并涵盖新增、修改和删除的DML操作。内容包括环境准备(如JDK、Flink版本等)、Oracle日志归档启用、用户权限配置、增量日志记录设置、元数据迁移、Flink安装与配置、生成Flink SQL文件、Streampark部署,以及创建和启动实时同步任务的具体步骤。适合需要跨数据库实时同步方案的技术人员参考。
【YashanDB知识库】Flink CDC实时同步Oracle数据到崖山
|
机器学习/深度学习 人工智能 监控
为什么选择工作流引擎?三大主流引擎优缺点剖析
工作流引擎是一种用于自动化、管理和监控业务流程的软件系统,通过预定义规则和流程模型协调任务流转。其核心功能包括流程建模、任务分配、状态跟踪和异常处理,能提升企业流程效率30%-50%,减少80%以上的人为错误。典型应用场景涵盖审批、生产、服务和决策类流程。主流引擎如Activiti、Flowable和Camunda各有特色,Camunda因高性能和完整工具链成为复杂项目的首选。未来趋势包括低代码集成、AI优化及云原生架构。
为什么选择工作流引擎?三大主流引擎优缺点剖析
|
Oracle Java 关系型数据库
Java SpringBoot集成Activiti7工作流
Java SpringBoot集成Activiti7工作流
|
存储 监控 测试技术
三大工作流引擎技术Activiti、Camunda、Flowable选型指南
三大工作流引擎技术Activiti、Camunda、Flowable选型指南
|
NoSQL 安全 Java
解决Unknown redis exception及event executor terminated错误的方法
解决这类问题时,保持耐心和细致是关键。通常,通过系统地检查和排除潜在原因,大多数问题最终都能被解决。
2436 1
|
XML Java 关系型数据库
Activiti工作流引擎介绍
Activiti工作流引擎介绍
|
Docker 容器
Docker export 和 save 区别
【8月更文挑战第3天】`docker export` 与 `docker save` 的关键区别在于处理对象和用途。`export` 将容器转为 `.tar` 文件,仅导出容器文件系统,不含元数据,适合快速备份或测试;`save` 则打包整个镜像及其元数据为 `.tar` 文件,用于镜像迁移或离线备份。前者通过 `import` 创建新镜像但无元数据,后者用 `load` 恢复完整镜像。
1297 1

热门文章

最新文章