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是一个开源的工作流引擎,用于实现企业内部的业务流程管理。它提供了一套强大且灵活的工作流功能,可以帮助企业实现高效的任务分配、流程管理和决策。下面是一个Flowable工作流使用示例的描述: 假设我们有一个采购审批流程,包含以下几个步骤:提交申请、主管审批、部门经理审批和财务审批。 首先,我们需要定义这个流程的模型。可以使用Flowable提供的BPMN 2.0标准来绘制流程图,或者使用Flowable自带的流程设计器来设计流程模型。在设计过程中,可以设置每个步骤的处理人、流程变量等信息。 然后,我们可以使用Flowable的API来编写代码,实现流程的部署和执行。通过Flowable的部署API,我们可以将流程模型部署到Flowable的引擎中。通过Flowable的运行API,我们可以启动流程实例,并管理流程的执行。 在我们的采购审批流程中,当一个员工提交申请后,流程会自动启动一个流程实例。然后,主管、部门经理和财务根据设定的顺序依次审批申请。每个步骤的审批结果都会影响流程的后续走向。 例如,如果主管拒绝了申请,流程会直接结束。如果主管通过了申请,流程会继续到下一个步骤,即部门经理审批。如果部门经理也通过了申请,流程会进入最后一个步骤,即财务审批。最后,如果财务同意了申请,流程会成功结束。否则,流程也会结束,并且申请被拒绝。 在流程的执行过程中,我们可以使用Flowable提供的监听器功能来监控流程的状态。通过监听器,我们可以获取流程的各个阶段信息,比如流程启动、任务分配、任务完成等。这些信息可以用于流程的监控和统计分析。 总之,Flowable提供了一个灵活且易于使用的工作流引擎,可以用于各种企业业务流程的管理和优化。以上是一个简单的Flowable工作流使用示例,希望对您有所帮助。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

刘刘刘刘刘先生

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值