Flowable介绍及使用示例

news2025/1/8 12:21:24

文章目录

  • Flowable简介
  • 底层实现
    • Java
    • Spring Framework
    • MyBatis
    • Activiti
  • Flowable的使用示例
    • 引入依赖
    • 创建流程定义
    • 部署流程定义
    • 启动流程实例
    • 启动流程实例
    • 处理任务
    • 监控流程实例
  • 高级用法
    • 流程监听器
    • 事件驱动
    • 定时任务
    • 其他高级功能
  • 使用时可能遇到的问题和注意事项
  • 结论
    • 参考文献

Flowable简介

Flowable是一个开源的用于处理和管理业务流程的框架。它提供了一个用于建模、执行和监控业务流程的平台。Flowable支持BPMN 2.0规范,提供了基于流程引擎的各种功能,包括流程定义、流程实例、任务、事件等。

底层实现

Java

Flowable的核心是基于Java语言开发的。Java提供了强大的面向对象编程能力,使得Flowable可以更好地封装和管理业务流程的各个组件。

Spring Framework

Flowable使用Spring Framework来实现依赖注入和事务管理等功能。Spring Framework提供了一个轻量级的容器,使得Flowable的组件可以方便地进行解耦和集成。

MyBatis

Flowable使用MyBatis作为持久层框架,用于与数据库进行交互。MyBatis提供了强大的SQL映射功能,能够方便地将Java对象映射到数据库表中。

Activiti

Flowable是由Activiti项目发展而来的。Activiti是一个基于BPMN 2.0规范的开源工作流引擎,Flowable在Activiti的基础上进行了改进和扩展。

Flowable的使用示例

下面以一个简单的请假流程为例,介绍Flowable的使用方法。

引入依赖

在项目的pom.xml文件中添加以下依赖:

<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-engine</artifactId>
    <version>6.7.0</version>
</dependency>

创建流程定义

使用BPMN 2.0规范创建一个请假流程的定义,保存为leave.bpmn20.xml文件。定义中包含了请假申请、主管审批和人事审批等环节。

部署流程定义

使用Flowable提供的API,将流程定义部署到流程引擎中:

ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deployment = repositoryService.createDeployment()
    .addClasspathResource("leave.bpmn20.xml")
    .deploy();

启动流程实例

使用Flowable提供的API,启动一个请假流程的实例:

RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");

启动流程实例

使用Flowable提供的API,启动一个请假流程的实例:

RuntimeService runtimeService = processEngine.getRuntimeService();
ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("leaveProcess");

处理任务

根据流程定义,流程实例会生成一系列的任务。使用Flowable提供的API,处理这些任务:

TaskService taskService = processEngine.getTaskService(); 
List tasks = taskService.createTaskQuery()
						.processInstanceId(processInstance.getId())
						.list(); 
for (Task task : tasks) {
	// 处理任务逻辑 // ... // 完成任务
	taskService.complete(task.getId());
}

监控流程实例

使用Flowable提供的API,可以监控流程实例的状态和执行情况:

HistoryService historyService = processEngine.getHistoryService();
HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery()
																.processInstanceId(processInstance.getId())
																.singleResult();
System.out.println("流程实例结束时间:" + historicProcessInstance.getEndTime());

高级用法

Flowable是一个功能强大的业务流程框架,除了基本的流程定义、流程实例和任务管理外,它还提供了许多高级功能,如流程监听器、事件驱动、定时任务等。

流程监听器

流程监听器可以在流程执行过程中监听和处理各种事件,例如流程启动、任务分配、任务完成等。我们可以通过实现 DelegateExecutionListener 接口来自定义流程监听器,并将其与流程定义关联。

以下是一个示例代码,演示了如何在流程启动和任务完成时触发自定义的流程监听器:

public class MyExecutionListener implements DelegateExecutionListener {

    @Override
    public void notify(DelegateExecution execution) {
        String eventName = execution.getEventName();
        if (EVENTNAME_START.equals(eventName)) {
            // 流程启动时触发的逻辑
            System.out.println("流程已启动");
        } else if (EVENTNAME_END.equals(eventName)) {
            // 任务完成时触发的逻辑
            System.out.println("任务已完成");
        }
    }
}

将监听器与流程定义关联:

BpmnModel bpmnModel = new BpmnModel();
Process process = new Process();
process.setId("myProcess");
process.addExecutionListener(EVENTNAME_START, new MyExecutionListener());
process.addExecutionListener(EVENTNAME_END, new MyExecutionListener());
bpmnModel.addProcess(process);

repositoryService.createDeployment()
    .addBpmnModel("myProcess.bpmn20.xml", bpmnModel)
    .deploy();

事件驱动

Flowable支持事件驱动的流程执行,即根据外部事件触发流程的执行。我们可以通过实现 FlowableEventListener 接口来监听并处理各种事件。

以下是一个示例代码,演示了如何使用事件驱动来触发流程执行:

public class MyEventListener implements FlowableEventListener {

    @Override
    public void onEvent(FlowableEvent event) {
        if (event.getType().equals(FlowableEngineEventType.PROCESS_STARTED)) {
            // 流程启动事件
            System.out.println("流程已启动");
        } else if (event.getType().equals(FlowableEngineEventType.TASK_COMPLETED)) {
            // 任务完成事件
            System.out.println("任务已完成");
        }
    }

    @Override
    public boolean isFailOnException() {
        return false;
    }
}

将事件监听器注册到流程引擎:

ProcessEngineConfiguration configuration = ProcessEngineConfiguration.createStandaloneProcessEngineConfiguration();
configuration.setEventListeners(Collections.singletonList(new MyEventListener()));
ProcessEngine processEngine = configuration.buildProcessEngine();

定时任务

Flowable支持定时任务的执行,可以在流程执行过程中设置定时事件,例如延时触发任务、定时触发事件等。

以下是一个示例代码,演示了如何在流程中设置定时任务:

BpmnModel bpmnModel = new BpmnModel();
Process process = new Process();
process.setId("myProcess");

StartEvent startEvent = new StartEvent();
startEvent.setId("startEvent"); process.addFlowElement(startEvent);

TimerEventDefinition timerEventDefinition = new TimerEventDefinition(); timerEventDefinition.setTimeDuration("PT1H"); startEvent.addEventDefinition(timerEventDefinition);

UserTask userTask = new UserTask(); userTask.setId("userTask"); process.addFlowElement(userTask);

SequenceFlow sequenceFlow = new SequenceFlow(); sequenceFlow.setSourceRef("startEvent"); sequenceFlow.setTargetRef("userTask"); process.addFlowElement(sequenceFlow);

bpmnModel.addProcess(process);

repositoryService.createDeployment() .addBpmnModel("myProcess.bpmn20.xml", bpmnModel) .deploy();

在上述示例中,我们创建了一个流程,其中包含一个启动事件(StartEvent)和一个用户任务(UserTask)。启动事件中设置了一个定时器事件定义(TimerEventDefinition),表示在流程启动后延时1小时触发任务。

其他高级功能

除了上述介绍的流程监听器、事件驱动和定时任务之外,Flowable还提供了许多其他高级功能,如并行网关、条件网关、子流程、消息中间事件等。这些功能可以帮助我们更灵活地建模和执行业务流程。

以下是一个示例代码,演示了如何在流程中使用并行网关和条件网关:

BpmnModel bpmnModel = new BpmnModel();
Process process = new Process();
process.setId("myProcess");

StartEvent startEvent = new StartEvent();
startEvent.setId("startEvent");
process.addFlowElement(startEvent);

ParallelGateway parallelGateway = new ParallelGateway();
parallelGateway.setId("parallelGateway");
process.addFlowElement(parallelGateway);

ExclusiveGateway exclusiveGateway = new ExclusiveGateway();
exclusiveGateway.setId("exclusiveGateway");
process.addFlowElement(exclusiveGateway);

UserTask userTask1 = new UserTask();
userTask1.setId("userTask1");
process.addFlowElement(userTask1);

UserTask userTask2 = new UserTask();
userTask2.setId("userTask2");
process.addFlowElement(userTask2);

EndEvent endEvent = new EndEvent();
endEvent.setId("endEvent");
process.addFlowElement(endEvent);

SequenceFlow sequenceFlow1 = new SequenceFlow();
sequenceFlow1.setSourceRef("startEvent");
sequenceFlow1.setTargetRef("parallelGateway");
process.addFlowElement(sequenceFlow1);

SequenceFlow sequenceFlow2 = new SequenceFlow();
sequenceFlow2.setSourceRef("parallelGateway");
sequenceFlow2.setTargetRef("userTask1");
process.addFlowElement(sequenceFlow2);

SequenceFlow sequenceFlow3 = new SequenceFlow();
sequenceFlow3.setSourceRef("parallelGateway");
sequenceFlow3.setTargetRef("exclusiveGateway");
process.addFlowElement(sequenceFlow3);

SequenceFlow sequenceFlow4 = new SequenceFlow();
sequenceFlow4.setSourceRef("userTask1");
sequenceFlow4.setTargetRef("exclusiveGateway");
process.addFlowElement(sequenceFlow4);

SequenceFlow sequenceFlow5 = new SequenceFlow();
sequenceFlow5.setSourceRef("exclusiveGateway");
sequenceFlow5.setTargetRef("userTask2");
sequenceFlow5.setConditionExpression("${approved}");
process.addFlowElement(sequenceFlow5);

SequenceFlow sequenceFlow6 = new SequenceFlow();
sequenceFlow6.setSourceRef("exclusiveGateway");
sequenceFlow6.setTargetRef("endEvent");
process.addFlowElement(sequenceFlow6);

bpmnModel.addProcess(process);

repositoryService.createDeployment()
    .addBpmnModel("myProcess.bpmn20.xml", bpmnModel)
    .deploy();

在上述示例中,我们创建了一个流程,其中包含一个并行网关(ParallelGateway)和一个条件网关(Exclusive Gateway)。并行网关用于同时执行多个任务,条件网关根据条件判断流程的走向。

在并行网关后面有两个用户任务(UserTask1和UserTask2),它们可以同时执行。在条件网关后面,根据条件 ${approved} 决定流程的走向,如果条件为true,则流程进入UserTask2;如果条件为false,则流程结束。

以上是Flowable的高级用法介绍,包括流程监听器、事件驱动、定时任务和其他高级功能。通过使用这些功能,我们可以更加灵活地建模和执行业务流程,满足各种复杂的业务需求。

使用时可能遇到的问题和注意事项

在使用Flowable时,可能会遇到以下问题和需要注意的事项:

  • 版本兼容性问题:Flowable的不同版本之间可能存在兼容性问题,需要根据具体情况选择合适的版本。
  • 数据库配置问题:Flowable默认使用H2数据库,可以通过配置文件修改为其他数据库,但需要注意数据库的兼容性和连接配置。
  • 流程定义的更新问题:如果流程定义发生变化,需要先进行流程定义的升级操作,再启动新的流程实例。
  • 任务处理的并发问题:在多线程环境下处理任务时,需要注意并发访问的线程安全性问题。

结论

Flowable是一个功能强大的业务流程框架,底层使用了Java、Spring Framework、MyBatis和Activiti等技术。通过示例代码的介绍,我们可以了解到如何使用Flowable来建模、执行和监控业务流程。在使用时要注意版本兼容性、数据库配置、流程定义的更新和任务处理的并发等问题。

参考文献

官方文档:Flowable官方文档提供了对Flowable框架的全面介绍和详细说明,包括流程定义、流程实例、任务管理、API参考等。可以访问以下链接获取文档:https://flowable.com/open-source/docs

Flowable GitHub仓库:Flowable的源代码托管在GitHub上,你可以在该仓库中找到示例代码、演示项目和最新的发布版本。访问以下链接获取Flowable GitHub仓库:https://github.com/flowable/flowable-engine

Flowable官方博客:Flowable官方博客定期发布有关Flowable的最新动态、功能更新和案例研究等文章。可以访问以下链接查看官方博客:https://blog.flowable.org/

Flowable论坛:Flowable官方论坛是一个活跃的社区,你可以在论坛上提问、交流和分享关于Flowable的问题和经验。访问以下链接参与Flowable论坛:https://forum.flowable.org/

Flowable官方培训课程:Flowable官方提供了一系列在线培训课程,帮助你深入学习Flowable的各个方面。可以访问以下链接获取官方培训课程:https://flowable.com/open-source/training/

如果大家遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言。

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1100423.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微信群发消息怎么发?群发消息,只要这4个步骤!

微信是我们日常生活中使用最广泛的社交软件之一。用户通过微信可以向好友、家人、同事等联系人发送文字、图片、视频、语音、文件等信息&#xff0c;是一款非常实用的即时通信应用程序。 除了与好友进行单独聊天&#xff0c;我们有时候可能也需要将信息进行群发。但是还有很多…

又要报销了,还在手动下载整理发票吗?

大多数公司都是每个月定期提交报销&#xff0c;一般报销用的发票都是电子发票发到邮箱&#xff0c;每次要报销时都需要登录邮箱&#xff0c;点开邮件&#xff0c;一个个下载整理&#xff0c;工作量不大&#xff0c;但是发票多了也着实很烦。这个月终于下决心把这个过程自动化一…

事务管理 vs. 锁控制:你真的分得清吗?何时使用何种并发控制策略?

分布式锁和事务是分布式系统中两个重要的概念&#xff0c;它们都用于解决分布式环境下的数据一致性问题。 一、概念 分布式锁 分布式锁是一种用于在分布式环境中控制对共享资源访问的锁。分布式锁可以防止多个进程或线程同时访问共享资源&#xff0c;从而避免数据冲突和资源…

Mini小主机All-in-one搭建教程4-安装Windows11系统

Mini小主机All-in-one搭建教程4-安装Windows11系统 硬件介绍 在狗东买的 极摩客M2 到手价是2799元 具体配置如下&#xff1a; 酷睿英特尔11代标压i7 11390H 64G1TB固态。 以下是 安装Windows11系统的教程。 安装Windows11系统 下载镜像包 首先下Windows系统的懒人镜像包&…

【特纳斯电子】基于物联网的智能油烟机-仿真设计

视频及资料链接&#xff1a;基于物联网的智能油烟机-仿真设计 - 电子校园网 (mcude.com) 编号&#xff1a; T0332203M-FZ 设计简介&#xff1a; 本设计是基于物联网的智能油烟机系统&#xff0c;主要实现以下功能&#xff1a; 1.通过OLED显示燃气浓度&#xff1b; 2.可通过…

多媒体应用设计师 第4章 移动多媒体技术基础

1.移动多媒体技术基础 1.1.移动互联网的定义 移动互联网是指利用互联网提供的技术、平台、应用以及商业模式&#xff0c;与移动通信技术相结合并用于实践活动的总称。 1.2.移动互联网的特征 移动互联网三个层面&#xff1a;终端、软件、应用 移动互联网特征&#xff1a;2版…

在搜狗浏览器中设置代理

要在搜狗浏览器中设置代理&#xff0c;请按照以下步骤操作&#xff1a; 打开搜狗浏览器。在浏览器顶部菜单栏中点击“设置”&#xff08;一般位于右上角&#xff09;。在设置菜单中点击“代理设置”。在代理设置页面中&#xff0c;将“使用代理”选项设置为“自动检测”或“al…

通讯网关软件026——利用CommGate X2ORACLE-U实现OPC UA数据转入ORACLE

本文介绍利用CommGate X2ORACLE-U实将OPC UA数据源中的数据转入到ORACLE数据库。CommGate X2ORACLE-U是宁波科安网信开发的网关软件&#xff0c;软件可以登录到网信智汇(http://wangxinzhihui.com)下载。 【案例】如下图所示&#xff0c;将OPC UA数据源的数据写入到ORACLE数据…

ssh 报错:Permission denied, please try again.

报错问题&#xff1a;执行一条远程scp远程拷贝&#xff0c;在此之前已配置好ssh无密登录&#xff0c; sudo scp -r hadoop-3.2.0 slave2:/usr/local/src/ 确保 /etc/ssh/sshd_config文件下 PasswordAuthentication no 改为 PasswordAuthentication yes 和 PermitRootLogin no …

云爬虫系统设计:云平台资源管理优化爬虫性能

目录 1、云爬虫系统概述 2、云平台资源管理优化爬虫性能的关键措施 2.1 资源池化 2.2 负载均衡 2.3 任务调度 2.4 异常处理和恢复 2.5 数据存储与处理 2.6 数据清洗和去重 2.7 分布式爬虫 2.8 任务优先级与质量 2.9节能与环保 2.10监控与日志 总结 随着互联网的快…

成都瀚网科技:如何有效运营抖店来客呢?

随着电子商务的快速发展和移动互联网的普及&#xff0c;越来越多的企业开始将目光转向线上销售渠道。其中&#xff0c;抖音成为备受关注的平台。作为中国最大的短视频社交平台之一&#xff0c;抖音每天吸引数亿用户&#xff0c;这也为企业提供了巨大的商机。那么&#xff0c;如…

解决github打开慢的问题

1&#xff0c;修改hosts&#xff08;可以从这个链接 https://raw.hellogithub.com/hosts 获取对应的host配置&#xff09;。 140.82.112.3 github.com 151.101.1.194 github.global.ssl.fastly.net 2&#xff0c;刷新dns缓存。 # 打开CMD运行如下命令 ipconfig /flushdns 之…

MATLAB-自动批量读取文件,并按文件名称或时间顺序进行数据处理

我在处理文件数据时&#xff0c;发现一个一个文件处理效率太低&#xff0c;因此学习了下MATLAB中自动读取特定路径下文件信息的程序&#xff0c;并根据读取信息使用循环进行数据处理&#xff0c;提高效率&#xff0c;在此分享给大家这段代码并给予一些说明&#xff0c;希望能为…

小程序新增功能页面

需求背景: 小程序主页面有个报名板块,我打算替换主页面报名板块菜单,迁移到我的页面里面, 替换成资讯栏目,我喜欢分享最新技术,开源课题,IT资讯,本想做成论坛的效果,由于时间问题,先替换添加板块 替换后效果: 模块功能: 添加、修改、删除、查看 文件目录:// 添…

git本地仓库及远端仓库推送【linux】

git本地仓库及远端仓库推送【linux】 一.git上创建仓库二.linux中git三板斧i.检查是否安装gitii.克隆仓库到本地iii.提交到本地仓库iiii.上传到远端仓库 三.其他内容补充git loggit status.gitignore 一.git上创建仓库 已经创建好的可以直接跳到第二步进入到创建仓库界面&…

Qt应用开发(基础篇)——头部视图 QHeaderView

一、前言 QHeaderView类继承于QAbstractItemView&#xff0c;为项目视图(QTableView、QTreeView等)提供标题行或标题列。 树结构视图 QTreeView 表格视图 QTableView 视图基类 QAbstractItemView QHeaderView有section的概念&#xff0c;表示整条标题栏的一个个小部分&#xff…

为小公司申请企业邮箱的步骤和方法

对于小公司来说&#xff0c;拥有自己的企业邮箱不仅可以提高公司的专业形象&#xff0c;还可以更好地管理内部和外部的通信。小公司应该如何申请企业邮箱呢&#xff1f;以下是一份详尽的指南。 小公司应该如何申请企业邮箱呢&#xff1f;基本上由三步组成&#xff1a;确定自己的…

class的get和set

class的get和set 一、使用场景二、代码实现 一、使用场景 当我们需要在用户获取或设置实例某个属性的时候做一些附加的操作的时候&#xff0c;就能利用这个特性。 二、代码实现 class Person {#name #age 0 // 设置私有属性存储值&#xff0c;避免被外部修改constructor(na…

智能微秘书+FastGPT,打造你的超级微信助手!

自 ChatGPT 面世以来&#xff0c;它开创了一种交互方式的新革命&#xff0c;引领着技术与人类交互方式的全新演变。特别是在 GPT-3.5 全面开放 API 接口后&#xff0c;基于语言模型&#xff08;LLM&#xff09;的各种应用如雨后春笋般涌现&#xff0c;显示了无限的可能性和创新…

RabbitMQ的LazyQueue

在默认情况下&#xff0c;RabbitMQ会将接收到的信息保存在内存中以降低消息收发的延迟。但在某些特殊情况下&#xff0c;这会导致消息积压&#xff0c;比如&#xff1a; 消费者宕机或出现网络故障消息发送量激增&#xff0c;超过了消费者处理速度消费者处理业务发生阻塞 一旦…