Flowable学习笔记

Posted by wangtiegang on January 27, 2020

Flowable是什么?

Flowable是一个使用Java编写的轻量级业务流程引擎,是Activiti的一个分支发展而来,主创是同一个人。 流程引擎是用来部署执行BPMN2.0流程定义的,日常工作中有很多流程,BPMN规范可以将流程拆解成一个个任务, 将各个任务连接起来就成了一个流程图,流程引擎启动流程之后,就可以按顺序执行,开发人员只需要专注于每个 任务的逻辑,而将任务之间的状态和流转逻辑交给流程引擎处理,从而节省时间。

集成Spring Boot2

Flowable使用同一个starter支持Spring Boot 2.0及1.5。主要支持Spring Boot 2.0。 所以监控(actuator) endpoint只支持2.0。Flowable的starter直接引用Spring Boot starter, 所以如果需要使用1.5版的Spring Boot starter,需要自行定义。

  • 在项目中添加 flowable-spring-boot-starter 依赖
1
2
3
4
5
<dependency>
    <groupId>org.flowable</groupId>
    <artifactId>flowable-spring-boot-starter</artifactId>
    <version>${flowable.version}</version>
</dependency>
  • 配置数据源
    1
    2
    3
    4
    
    # 数据源使用spring配置,可以使用第三方连接池,比如druid
    spring.datasource.url=jdbc:mysql://127.0.0.1:3306/flowable-spring-boot?characterEncoding=UTF-8
    spring.datasource.username=flowable
    spring.datasource.password=flowable
    
  • REST支持

通常会在嵌入的Flowable引擎之上,使用REST API(用于与公司的不同服务交互)。

1
2
3
4
5
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-web</artifactId>
    <version>${spring.boot.version}</version>
</dependency>

加入依赖之后,就可以直接注入flowable的服务类了,创建一个新的Spring服务类,并创建两个方法:一个用于启动流程,另一个用于获得给定任务办理人的任务列表。 在这里只是简单地包装了Flowable调用,但在实际使用场景中会比这复杂得多。然后可以自己创建 Controller 类封装一下, 就可以通过restful调用了。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@Service
public class MyService {

    @Autowired
    private RuntimeService runtimeService;

    @Autowired
    private TaskService taskService;

    @Transactional
    public void startProcess() {
        runtimeService.startProcessInstanceByKey("oneTaskProcess");
    }

    @Transactional
    public List<Task> getTasks(String assignee) {
        return taskService.createTaskQuery().taskAssignee(assignee).list();
    }

}

流程引擎API与服务

引擎API是与Flowable交互的最常用手段。总入口点是ProcessEngine。 ProcessEngine可以使用多种方式创建。使用ProcessEngine,可以获得各种提供工作流/BPM方法的服务。 ProcessEngine与服务对象都是线程安全的,因此可以在服务器中保存并共用同一个引用。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
// 以下服务类可以在spring中自动注入

// 流程引擎
ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();
// 运行时服务,可以用来获取代办,任务,查询流程状态,处理任务等
RuntimeService runtimeService = processEngine.getRuntimeService();
// 仓库服务,可以部署流程定义
RepositoryService repositoryService = processEngine.getRepositoryService();
// 任务服务,可以获取具体的任务,处理任务等
TaskService taskService = processEngine.getTaskService();
// 通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。
ManagementService managementService = processEngine.getManagementService();
// 用于管理(创建,更新,删除,查询……)组与用户。
IdentityService identityService = processEngine.getIdentityService();
// 历史服务,可以查询历史流程和相关信息
HistoryService historyService = processEngine.getHistoryService();
// 表单服务,可以在流程中使用定义好的表单
FormService formService = processEngine.getFormService();
// 可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。
DynamicBpmnService dynamicBpmnService = processEngine.getDynamicBpmnService();

Flowable会在数据库中建立一套表,用来存储流程定义,流程运行实例,流程实例状态和相关变量信息,历史流程等。 通过processEngine启动流程之后,就可以通过其他服务操作流程了。