https://tkjohn.github.io/flowable-userguide/
https://github.com/flowable/flowable-engine/releases/download/flowable-6.7.0/flowable-6.7.0.zip
org.flowable
flowable-engine
6.6.0
junit
junit
test
public class flowableTest {
@Test
public void flow(){
ProcessEngineConfiguration cfg=new StandaloneProcessEngineConfiguration();
cfg.setJdbcDriver("com.mysql.cj.jdbc.Driver");
cfg.setJdbcUrl("jdbc:mysql://localhost:3306/flowable?serverTimezone=Asia/Shanghai&allowMultiQueries=true&useUnicode=true&characterEncoding=UTF-8&useSSL=false");
cfg.setJdbcUsername("root");
cfg.setJdbcPassword("root");
//如果数据库表不存在就新建
cfg.setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE);
cfg.buildProcessEngine();
}
}
1、Flowable的所有数据库表都以ACT_开头。第二部分是说明表用途的两字符标示符。服务API的命名也大略符合这个规则。
2、ACT_RE_: 'RE’代表repository。带有这个前缀的表包含“静态”信息,例如流程定义与流程资源(图片、规则等)。
3、ACT_RU_: 'RU’代表runtime。这些表存储运行时信息,例如流程实例(process instance)、用户任务(user task)、变量(variable)、作业(job)等。Flowable只在流程实例运行中保存运行时数据,并在流程实例结束时删除记录。这样保证运行时表小和快。
4、ACT_HI_: 'HI’代表history。这些表存储历史数据,例如已完成的流程实例、变量、任务等。
5、ACT_GE_: 通用数据。在多处使用。
1)通用数据表(2个)
2)历史表(8个,HistoryService接口操作的表)
3)用户相关表(4个,IdentityService接口操作的表)
4)流程定义、流程模板相关表(3个,RepositoryService接口操作的表)
5)流程运行时表(6个,RuntimeService接口操作的表)
1、RepositoryService很可能是使用Flowable引擎要用的第一个服务。这个服务提供了管理与控制部署(deployments)与流程定义(processdefinitions)的操作。
2、RuntimeService用于启动流程定义的新流程实例。
3、IdentityService很简单。它用于管理(创建,更新,删除,查询……)组与用户。
4、FormService是可选服务。也就是说Flowable没有它也能很好地运行,而不必牺牲任何功能。
5、HistoryService暴露Flowable引擎收集的所有历史数据。要提供查询历史数据的能力。
6、ManagementService通常在用Flowable编写用户应用时不需要使用。它可以读取数据库表与表原始数据的信息,也提供了对作业(job)的查询与管理操作。
7、DynamicBpmnService可用于修改流程定义中的部分内容,而不需要重新部署它。例如可以修改流程定义中一个用户任务的办理人设置,或者修改一个服务任务中的类名。
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
Deployment deploy = repositoryService.createDeployment().addClasspathResource("holiday-request.bpmn20.xml").deploy();
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ProcessDefinitionQuery processDefinitionQuery = repositoryService.createProcessDefinitionQuery();
/**
* Deployment deployment
* deploymentId 设置流程id(deployment.getId())
* singleResult 返回单个
*/
ProcessDefinition processDefinition = processDefinitionQuery.deploymentId(deployment.getId()).singleResult();
ProcessEngine processEngine = cfg.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
/**
* deleteDeployment
* Deployment deployment
* 第一参数是流程id(deployment.getId()) 如果流程启动将不允许删除
* 第二参数数级联删除 如果流程启动了也可以删除 相关的任务也会删除
*/
repositoryService.deleteDeployment(deployment.getId());
ProcessDefinitionQuery processDefinitionQuery =
repositoryService.createProcessDefinitionQuery();
ProcessEngine processEngine = cfg.buildProcessEngine();
RuntimeService runtimeService = processEngine.getRuntimeService();
//表单信息 例如请假人的信息
Map map=new HashMap<>();
//
runtimeService.startProcessInstanceByKey("holidayRequest",map);
ProcessEngine processEngine = cfg.buildProcessEngine();
//查询任务
TaskService taskService = processEngine.getTaskService();
List taskList = taskService.createTaskQuery()
.processDefinitionKey("xml中流程的id")
.taskAssignee("")//任务处理人
.list();
ProcessEngine processEngine = cfg.buildProcessEngine();
//查询任务
TaskService taskService = processEngine.getTaskService();
List taskList = taskService.createTaskQuery()
.processDefinitionKey("xml中流程的id")
.taskAssignee("")//任务处理人
.list();
//创建流程变量
Map variables = new HashMap();
variables.put("approved", approved);
for (Task task: taskList ) {
//结束
taskService.complete(task.getId(), variables);
}
ProcessEngine processEngine = cfg.buildProcessEngine();
HistoryService historyService = processEngine.getHistoryService();
List activities =
historyService.createHistoricActivityInstanceQuery()
.processInstanceId(processInstance.getId())
.finished()
.orderByHistoricActivityInstanceEndTime().asc()
.list();
for (HistoricActivityInstance activity : activities) {
System.out.println(activity.getActivityId() + " took "
+ activity.getDurationInMillis() + " milliseconds");
}
服务任务(service task)
public class CallExternalSystemDelegate implements JavaDelegate {
public void execute(DelegateExecution execution) {
System.out.println("Calling the external system for employee "
+ execution.getVariable("employee"));
}
}