Flowable介绍及使用示例

这篇具有很好参考价值的文章主要介绍了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/

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

Flowable介绍及使用示例,java,mybatis,spring,流程图文章来源地址https://www.toymoban.com/news/detail-715228.html

到了这里,关于Flowable介绍及使用示例的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Springboot +Flowable,通过代码绘制流程图并设置高亮

    通过代码绘制一张流程图,并设置成高亮。 首先先来看一下绘制出来的效果图,截图如下: 已经执行的节点和连线用红色标记出来,大致上就是这么一个效果。 将一个流程图绘制成图片,相关的 API 在 flowable 中其实都是有提供的,流程图片的绘制,是根据流程的定义来绘制

    2024年02月02日
    浏览(46)
  • 企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图

    功能模块: 待办消息,招标公告,中标公告,信息发布 描述: 全过程数字化采购管理,打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力,为外部供应商集中推送展示与其相关的所有采购业务信息(历史合作、考

    2024年02月09日
    浏览(48)
  • 企业电子招标采购系统源码Spring Boot + Mybatis + Redis + Layui + 前后端分离 构建企业电子招采平台之立项流程图 tbms

     项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化

    2024年02月14日
    浏览(47)
  • Spring注解 @EventListener 的介绍与使用示例以及异常处理

    用途 将一个方法标记为监听器,用于监听应用程序事件,事件可以是 ApplicationEvent 实例,也可以是其他任意的对象。 如果一个监听器(被标注的方法)只支持单一的事件类型,那么该方法可以声明一个唯一的参数用来反映要监听的事件类型。 如果一个监听器(被标注的方法

    2024年01月15日
    浏览(74)
  • MyBatis中的缓存介绍与示例

    目录 什么是缓存? 一级缓存 实例效果 二次缓存 示例效果 什么是缓存? 在用户访问相同数据时,需要对数据库多次访问,导致产生大量IO、读写硬盘的操作,效率低下,有了缓存首次访问时,查询到数据库数据库,将数据库存储到缓存中,再次访问时,直接访问缓存减少

    2024年02月13日
    浏览(34)
  • 【Java系列】Mybatis-Plus 使用方式介绍

    Mybatis-Plus 提供了多种方式来执行 SQL,包括使用注解、XML 映射文件和 Lambda 表达式等。其中,使用 Lambda 表达式是 Mybatis-Plus 推荐的方式,因为它更加直观和类型安全。 以下是一个使用 Lambda 表达式执行 SQL 的示例,现在我们有一个名为  User  的实体类,其中包含  id 、 name  

    2024年02月07日
    浏览(91)
  • 【Java系列】Mybatis-Plus 使用介绍二

    你只管努力,其他交给时间,时间会证明一切。 MyBatis-Plus 是 MyBatis 的增强工具,它简化了 MyBatis 的开发,并提供了许多实用的功能和工具类。下面是 MyBatis-Plus 的使用方法: 在 Maven 项目中,需要在 pom.xml 文件中添加如下依赖: 其中  mybatis-plus-boot-starter  是 MyBatis-Plus 的 S

    2024年02月08日
    浏览(52)
  • Java版企业电子招标采购系统源代码Spring Boot + 二次开发 + 前后端分离 构建企业电子招采平台之立项流程图

      项目说明 随着公司的快速发展,企业人员和经营规模不断壮大,公司对内部招采管理的提升提出了更高的要求。在企业里建立一个公平、公开、公正的采购环境,最大限度控制采购成本至关重要。符合国家电子招投标法律法规及相关规范,以及审计监督要求;通过电子化

    2024年02月07日
    浏览(73)
  • 【Java核心知识】spring boot整合Mybatis plus + Phoenix 访问Hbase与使用注意

    为什么Phoenix能让开发者通过SQL访问Hbase而不必使用原生的方式?引用Phoenix官网上的一句话:SQL is just a way of expressing what you want to get not how you want to get it . 即SQL不是一种数据操作技术,而是一种特殊的表达方式。只是表示你需要什么而不是你如何获得。 一个集成了Phoenix的Hb

    2024年02月15日
    浏览(66)
  • Spring Boot集成MyBatis Plus中的QueryWrapper的eq方法详解及示例代码

    1. 简介 MyBatis Plus是一个强大的MyBatis增强工具包,它为我们在进行数据库操作时提供了很多便利的方法。其中,QueryWrapper是MyBatis Plus中的一个重要类,它可以用于构建复杂的查询条件。 在QueryWrapper中,eq方法是最常用的一个,它用于构建等值条件查询。在本文中,我们将详细

    2024年02月10日
    浏览(38)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包