Flowable介绍及使用示例

news/2024/5/19 2:08:00 标签: java, mybatis, spring, 流程图

文章目录

  • 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,将流程定义部署到流程引擎中:

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

启动流程实例

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

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

启动流程实例

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

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

处理任务

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

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

监控流程实例

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

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

高级用法

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

流程监听器

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

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

java">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("任务已完成");
        }
    }
}

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

java">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 接口来监听并处理各种事件。

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

java">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;
    }
}

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

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

定时任务

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

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

java">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还提供了许多其他高级功能,如并行网关、条件网关、子流程、消息中间事件等。这些功能可以帮助我们更灵活地建模和执行业务流程。

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

java">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.niftyadmin.cn/n/5096068.html

相关文章

sort和vector巧妙用法

sort(arr.begin(),arr.end(),[x](int a,int b){return abs(a-x)<abs(b-x)||abs(a-x)abs(b-x)&&a<b;});return vector<int>(arr.begin(),arr.begin()k);

内裤洗衣机有用吗?内衣洗衣机推荐

冬天正在临近&#xff0c;普通的衣服有日常的洗衣机洗&#xff0c;但内衣裤就成了很多小伙伴的困扰&#xff0c;在我们的观念中&#xff0c;内衣裤是绝对不可以和普通的衣服一起清洗&#xff0c;在冰冷的冬季还要手洗这些贴身衣物&#xff0c;真的很难受&#xff0c;所以拥有一…

【Java】SimpleDateFormat格式化日期

SimpleDateFormat 是用于以区域设置敏感的方法格式化和解析日期。它允许格式化&#xff08;日期文本&#xff09;&#xff0c;解析&#xff08;文本日期&#xff09; 对时间日期进行格式化处理把Date对象转换为年月日时分秒格式字符串把字符串转换为Date对象 常用的模式字母及对…

LeetCode //C++ - 427. Construct Quad Tree

427. Construct Quad Tree Given a n * n matrix grid of 0’s and 1’s only. We want to represent grid with a Quad-Tree. Return the root of the Quad-Tree representing grid. A Quad-Tree is a tree data structure in which each internal node has exactly four c…

mysql按指定字符截取

1、使用SUBSTRING函数进行截取 语法&#xff1a;str是要截取的字符串&#xff0c;pos是起始位置&#xff0c;len是要截取的长度 SUBSTRING(str, pos, len)例子 SELECT SUBSTRING(Hello, World!, 1, 5);返回"Hello"。其中&#xff0c;起始位置为1&#xff0c;截取的…

一文带你认识高速低侧栅极驱动器 FAN3111ESX 带你深入了解其特点及应用

FAN3111ESX一款低端驱动器产品&#xff0c;是外部 DC 2 至 5 V 参考输入、单通道同相输出、1.4 A 峰值灌电流、1.4 A 源电流低端栅极驱动器。 FAN3111ESX 1A栅极驱动器为驱动一个在低侧开关应用中的 N沟道增强型 MOSFET 而设计。 对于使用低压控制器和其它和驱动器相比使用更…

【2023研电赛】基于三维视觉感知的可重构智能表面通信方案

该作品参与极术社区组织的研电赛作品征集活动&#xff0c;欢迎同学们投稿&#xff0c;获取作品传播推广&#xff0c;并有丰富礼品哦~ 基于三维视觉感知的可重构智能表面通信方案 参赛单位&#xff1a;华北水利水电大学 参赛队伍&#xff1a;智能队 指导老师&#xff1a;邵霞 参…

nginx 发布vue项目 页面刷新出现404问题

nginx的conf目录下的nginx.conf增加配置 server {listen 80;#其他配置.......#增加的配置&#xff0c;注意 / 要改成自己的项目目录&#xff0c;我这里是域名直接访问&#xff0c;没有项目名&#xff0c;所以直接是斜杠location / {try_files $uri $uri/ router;index index…