Flowable是一个开源的用于处理和管理业务流程的框架。它提供了一个用于建模、执行和监控业务流程的平台。Flowable支持BPMN 2.0规范,提供了基于流程引擎的各种功能,包括流程定义、流程实例、任务、事件等。
Flowable的核心是基于Java语言开发的。Java提供了强大的面向对象编程能力,使得Flowable可以更好地封装和管理业务流程的各个组件。
Flowable使用Spring Framework来实现依赖注入和事务管理等功能。Spring Framework提供了一个轻量级的容器,使得Flowable的组件可以方便地进行解耦和集成。
Flowable使用MyBatis作为持久层框架,用于与数据库进行交互。MyBatis提供了强大的SQL映射功能,能够方便地将Java对象映射到数据库表中。
Flowable是由Activiti项目发展而来的。Activiti是一个基于BPMN 2.0规范的开源工作流引擎,Flowable在Activiti的基础上进行了改进和扩展。
下面以一个简单的请假流程为例,介绍Flowable的使用方法。
在项目的pom.xml文件中添加以下依赖:
<dependency>
<groupId>org.flowablegroupId>
<artifactId>flowable-engineartifactId>
<version>6.7.0version>
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是一个功能强大的业务流程框架,底层使用了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/
如果大家遇到类似问题,欢迎评论区讨论,如有错误之处,敬请留言。