Flowable 常用类及其作用
![]() |
ProcessEngineConfiguration 和 ProcessEngine
- ProcessEngineConfiguration:流程引擎配置类。
- ProcessEngine:流程引擎。
ProcessEngineConfiguration 封装 ProcessEngine 的配置信息,ProcessEngine 由具体的 ProcessEngineConfiguration 实例化。
public class HolidayRequest { public static void main(String[] args) { ProcessEngineConfiguration cfg = new StandaloneProcessEngineConfiguration() .setJdbcUrl("jdbc:h2:mem:flowable;DB_CLOSE_DELAY=-1") .setJdbcUsername("sa") .setJdbcPassword("") .setJdbcDriver("org.h2.Driver") .setDatabaseSchemaUpdate(ProcessEngineConfiguration.DB_SCHEMA_UPDATE_TRUE); ProcessEngine processEngine = cfg.buildProcessEngine(); } }
如上所示,可通过 ProcessEngineConfiguration 配置数据源等。
RepositoryService、Deployment 和 ProcessDefinition
- RepositoryService:资源管理类。
- Deployment:流程部署信息。
- ProcessDefinition:流程定义。
有了 ProcessEngine,里面还没有流程,具体来说就是还没有流程定义。
平时通过绘制的流程图来定义流程,绘制的流程图底层是一个 XML(BPMN 2.0 XML)。
有了 XML,还需要将它部署到引擎中。将流程定义部署至 Flowable 引擎,需要使用 RepositoryService,其可以从 ProcessEngine 对象获取。
RepositoryService repositoryService = processEngine.getRepositoryService(); Deployment deployment = repositoryService.createDeployment() .addClasspathResource("holiday-request.bpmn20.xml") .deploy();
如上,使用 RepositoryService,按指定的 XML 文件创建一个新的部署 (Deployment),并调用 deploy() 方法完成流程定义的部署。
部署好流程后,可通过 RepositoryService 获取流程定义(ProcessDefinition)。
ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .deploymentId(deployment.getId()) .singleResult(); System.out.println("Found process definition : " + processDefinition.getName());
RuntimeService 和 ProcessInstance
- RuntimeService:流程运行管理类。
- ProcessInstance:流程实例。
有了流程定义之后,可以使用 RuntimeService 启动一个流程实例。一个流程定义可以启动多个流程实例(ProcessInstance),流程定义相当于流程实例的蓝图。
RuntimeService runtimeService = processEngine.getRuntimeService(); Map<String, Object> variables = new HashMap<String, Object>(); variables.put("employee", employee); variables.put("nrOfHolidays", nrOfHolidays); variables.put("description", description); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("holidayRequest", variables);
同时注意到启动流程实例时,传入了一个 Map,其中保存着一些字段信息。这样这些字段信息就和这个流程实例关联起来了。
TaskService 和 Task
- TaskService:任务管理类。
- Task:审批任务。
启动流程实例后,会生成对应的审核任务(Task)记录。可使用 TaskService 查询任务。
TaskService taskService = processEngine.getTaskService(); List<Task> tasks = taskService.createTaskQuery().taskCandidateGroup("managers").list();
查到任务后,可以将其完成,也就是完成审核。
// 选择任务 System.out.println("Which task would you like to complete?"); int taskIndex = Integer.valueOf(scanner.nextLine()); Task task = tasks.get(taskIndex - 1); // 确认提示 Map<String, Object> processVariables = taskService.getVariables(task.getId()); System.out.println(processVariables.get("employee") + " wants " + processVariables.get("nrOfHolidays") + " of holidays. Do you approve this?"); // 封装信息到 Map boolean approved = scanner.nextLine().toLowerCase().equals("y"); variables = new HashMap<String, Object>(); variables.put("approved", approved); // 完成审核 taskService.complete(task.getId(), variables);
HistoryService 和 HistoricActivityInstance
- HistoryService:历史管理类。
- HistoricActivityInstance:历史活动实例。
Flowable 可以自动存储所有流程实例的审计数据或历史数据。
如果希望显示流程实例已经执行的时间,可以从 ProcessEngine 获取 HistoryService,查询历史活动(historical activities)信息。
HistoryService historyService = processEngine.getHistoryService(); List<HistoricActivityInstance> activities = historyService.createHistoricActivityInstanceQuery() .processInstanceId(processInstance.getId()) .finished() .orderByHistoricActivityInstanceEndTime().asc() .list(); for (HistoricActivityInstance activity : activities) { System.out.println(activity.getActivityId() + " took " + activity.getDurationInMillis() + " milliseconds"); }
参考:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通