流程引擎基础知识

article/2025/8/27 13:49:44

流程引擎基础知识

    • 流程部署
    • 流程取消部署
    • 流程发起
    • 流程取回
    • 流程作废
    • 流程委托
    • 流程流转
    • 常用流程表介绍
    • 备注

流程部署

1.后台直接导入bpmn

        /**流程部署源代码*/public void deploy() {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.createDeployment().addClasspathResource("test.bpmn").name("谁家女儿郎").deploy();}

2.前端画模型

       /*** 创建模型*/@RequestMapping("/create")public Result<String> create(@RequestBody ModelDTO dto, HttpServletRequest request, HttpServletResponse response) {Result<String> result = new Result<String>();try {String modelId = actModelService.save(dto.getName(), dto.getKey(), dto.getDescription());result.setResult(modelId);//response.sendRedirect(request.getContextPath() + "/modeler.html?modelId=" + modelId);} catch (Exception e) {e.printStackTrace();log.error("新建流程失败!");}return result;}public String save(String name, String key, String description) throws UnsupportedEncodingException {//新建一个空模型Model model = repositoryService.newModel();//metaInfo信息ObjectNode metaInfo = objectMapper.createObjectNode();metaInfo.put(ModelDataJsonConstants.MODEL_NAME, name);metaInfo.put(ModelDataJsonConstants.MODEL_DESCRIPTION, description);metaInfo.put(ModelDataJsonConstants.MODEL_REVISION, model.getVersion());model.setKey(key);model.setName(name);model.setMetaInfo(metaInfo.toString());repositoryService.saveModel(model);ObjectNode editorNode = objectMapper.createObjectNode();editorNode.put("id", "canvas");editorNode.put("resourceId", "canvas");ObjectNode stencilset = objectMapper.createObjectNode();stencilset.put("namespace", "http://b3mn.org/stencilset/bpmn2.0#");editorNode.set("stencilset", stencilset);repositoryService.addModelEditorSource(model.getId(), editorNode.toString().getBytes("utf-8"));return model.getId();}/*** 流程部署* @param id* @return*/@GetMapping("deploy/{id}")public Result deploy(@PathVariable("id") String id) {actModelService.deploy(id);return Result.OK("流程发布成功");}public void deploy(String id) {try {Model model = repositoryService.getModel(id);BpmnJsonConverter jsonConverter = new BpmnJsonConverter();JsonNode editorNode = new ObjectMapper().readTree(repositoryService.getModelEditorSource(model.getId()));BpmnModel bpmnModel = jsonConverter.convertToBpmnModel(editorNode);BpmnXMLConverter xmlConverter = new BpmnXMLConverter();byte[] bpmnBytes = xmlConverter.convertToXML(bpmnModel);String processName = model.getName();if (!StringUtils.endsWith(processName, ".bpmn20.xml")){processName += ".bpmn20.xml";}ByteArrayInputStream in = new ByteArrayInputStream(bpmnBytes);Deployment deployment = repositoryService.createDeployment().name(model.getName()).addInputStream(processName, in).deploy();List<ProcessDefinition> list = repositoryService.createProcessDefinitionQuery().deploymentId(deployment.getId()).list();if (list.size() == 0){throw new JeecgBootException("流程定义为空");}} catch (Exception e) {throw new JeecgBootException(e);}}

流程取消部署

1.后台直接导入bpmn

    @GetMapping("/caceldeploy")@ApiOperation(notes = "取消部署", value = "取消部署")public void caceldeploy(String deployId) {ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine();RepositoryService repositoryService = processEngine.getRepositoryService();repositoryService.deleteDeployment(deployId, true);}

2.前端画模型

/*** 删除流程设计模型* @param ids* @return*/@GetMapping(value = "/delete")public Result delete(@RequestParam(name = "ids", required = true) String ids) {if(CommonRandomUtil.isNotEmpty(ids)) {for (String id : Arrays.asList(ids.split(","))) {actModelService.delete(id);   //直接删除流程设计模型}}return Result.OK("流程删除成功");}//备注:需实现repositoryService的void deleteDeployment(String deploymentId)的接口

流程发起

1.启动流程,后台导入bpmn

   @GetMapping("/startProcessInstanceByKey")@ApiOperation(notes = "创建流程实例", value = "创建流程实例")public Result<?> startProcessInstanceByKey(String processDefinitionKey, String businessKey, String initiator) {Map<String, Object> map = new HashMap<>();map.put("name", "deng");map.put("reason", "等天黑");//设置流程发起人identityService.setAuthenticatedUserId("deng");ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(processDefinitionKey, businessKey, map);return Result.OK("等天黑");}

2.流程改造后的启动流程

	/*** 启动流程* @param userId* @param businessKey* @param variables* @param extActProcessForm* @return* @throws BpmException*/private ProcessInstance startWorkflow(String userId, String businessKey, Map<String, Object> variables, ExtActProcessForm extActProcessForm) throws BpmException{// 设置流程发起人identityService.setAuthenticatedUserId(userId);variables.put(WorkFlowGlobals.BPM_FORM_BUSINESSKEY, businessKey);variables.put(WorkFlowGlobals.BPM_FORM_TYPE, extActProcessForm.getFormType());variables.put(WorkFlowGlobals.BPM_BIZ_TITLE, BpmUtil.getContent(variables,extActProcessForm.getTitleExp()));variables.put(WorkFlowGlobals.BPM_PROC_DEAL_STYLE, ProcDealStyleEnum.toEnum(extActProcessForm.getFormDealStyle()).getCode());//根据流程id查询流程信息ExtActProcess extActProcess = extActProcessMapper.selectById(extActProcessForm.getProcessId());//获取最新发布的流程定义-----------------核心代码1ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery().processDefinitionKey(extActProcess.getProcessKey()).latestVersion().singleResult();//update-begin--Author:zhoujf  Date:20180727 for:流程未发布流程提交异常处理if(processDefinition==null){throw new BpmException("流程未发布,请先发布流程!");}String formUrl = (String)variables.get(WorkFlowGlobals.BPM_FORM_CONTENT_URL);String formUrlM = (String)variables.get(WorkFlowGlobals.BPM_FORM_CONTENT_URL_MOBILE);formUrl = BpmUtil.getNodeUrl(variables, formUrl, businessKey);formUrlM = BpmUtil.getNodeUrl(variables, formUrlM, businessKey);variables.put(WorkFlowGlobals.BPM_FORM_CONTENT_URL, formUrl);variables.put(WorkFlowGlobals.BPM_FORM_CONTENT_URL_MOBILE, formUrlM);//根据流程id和部署id查询流程部署节点
//		List<ExtActProcessNodeDeployment> nodeList = new ArrayList<ExtActProcessNodeDeployment>();
//		LambdaQueryWrapper<ExtActProcessNodeDeployment> queryWrapper = new LambdaQueryWrapper<ExtActProcessNodeDeployment>();
//		queryWrapper.eq(ExtActProcessNodeDeployment::getProcessId, extActProcessForm.getProcessId());
//		queryWrapper.eq(ExtActProcessNodeDeployment::getDeploymentId, processDefinition.getDeploymentId());
//		nodeList = extActProcessNodeDeploymentService.list(queryWrapper);
//		if(nodeList!=null&&nodeList.size()>0){
//			for(ExtActProcessNodeDeployment node:nodeList){
//				if(oConvertUtils.isNotEmpty(node.getModelAndView())){
//					variables.put(node.getProcessNodeCode()+":"+WorkFlowGlobals.SUFFIX_BPM_FORM_URL, node.getModelAndView());
//				}
//				if(oConvertUtils.isNotEmpty(node.getModelAndViewMobile())){
//					variables.put(node.getProcessNodeCode()+":"+WorkFlowGlobals.SUFFIX_BPM_FORM_URL_MOBILE, node.getModelAndViewMobile());
//				}
//			}
//		}//创建流程实例------------------------------------------------核心代码2ProcessInstance processInstance = runtimeService.startProcessInstanceByKey(extActProcess.getProcessKey(), businessKey, variables);if(processInstance==null||oConvertUtils.isEmpty(processInstance.getProcessInstanceId())){return null;}//将流程实例ID存在流程变量里面 ----------------------------------核心代码3runtimeService.setVariable(processInstance.getProcessInstanceId(), WorkFlowGlobals.JG_LOCAL_PROCESS_ID, processInstance.getProcessInstanceId());return processInstance;}

流程取回

/*** 我发起的流程,流程追回按钮,流程取回* 流程追回:删除流程实例,启动表单单据保留,** @param* @return*/@PostMapping(value = "/callBackProcess")public Result<Map<String, Object>> callBackProcess(@RequestBody HashMap<String, String> map,HttpServletRequest request) {Result<Map<String, Object>> result = new Result<Map<String, Object>>();try {//添加评定业务流程取回时重置表数据功能String processInstanceId1 = map.get("processInstanceId");//Map<String, Object> flowDataByProcInstId = extActFlowDataService.getFlowDataByProcInstId(processInstanceId1);//extActFlowDataService.updateFormDataById((String) flowDataByProcInstId.get("formDataId"));String processInstanceId = oConvertUtils.getString(map.get("processInstanceId"));ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();runtimeService.setVariable(pi.getProcessInstanceId(), WorkFlowGlobals.BPM_STATUS, WorkFlowGlobals.PROCESS_CALLBACKPROCESS_STATUS);runtimeService.deleteProcessInstance(processInstanceId, "发起人流程追回");result.success("追回成功");} catch (Exception e) {e.printStackTrace();result.error500("追回失败");}return result;}

流程作废

	/*** 我发起的流程,作废按钮** @param* @return*/@PostMapping(value = "/invalidProcess")public Result<Map<String, Object>> invalidProcess(@RequestBody HashMap<String, String> map,HttpServletRequest request) {Result<Map<String, Object>> result = new Result<Map<String, Object>>();try {String processInstanceId = oConvertUtils.getString(map.get("processInstanceId"));ProcessInstance pi = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();runtimeService.setVariable(pi.getProcessInstanceId(), WorkFlowGlobals.BPM_STATUS, WorkFlowGlobals.PROCESS_INVALIDPROCESS_STATUS);runtimeService.deleteProcessInstance(processInstanceId, "发起人流程作废");result.success("作废成功");} catch (Exception e) {e.printStackTrace();result.error500("作废失败");}return result;}

流程委托

/*** 委托** @param* @return*/@PostMapping(value = "/taskEntrust111")public Result<Map<String, Object>> taskEntrust111(@RequestBody HashMap<String, String> map,HttpServletRequest request) {Result<Map<String, Object>> result = new Result<Map<String, Object>>();try {String taskId = oConvertUtils.getString(map.get("taskId"));//委托要改成批量委托taskId用逗号分隔List<String> list = Arrays.asList(taskId.split(","));for (String s : list) {String taskAssignee = oConvertUtils.getString(map.get("taskAssignee"));Task task = taskService.createTaskQuery().taskId(s).active().singleResult();//判断任务是否签收没有签收需要进行签收if (oConvertUtils.isEmpty(task.getAssignee())) {String userId = JwtUtil.getUserNameByToken(request);taskService.claim(s, userId);}taskService.delegateTask(task.getId(), taskAssignee);}result.success("委托成功");} catch (Exception e) {e.printStackTrace();result.error500("委托失败");}return result;}

流程流转

/*** 提交流程处理** @param map* @param request* @return*/@PostMapping(value = "processComplete")public Result<Object> processComplete(@RequestBody HashMap<String, String> map,HttpServletRequest request) {Long startTime = System.currentTimeMillis();log.debug("进入方法processComplete内,当前时间戳{}" + startTime);Result<Object> result = new Result<Object>();try {//监听通过request取到参数的信息的处理request.setAttribute("data", map);String taskId = oConvertUtils.getString(map.get("taskId"));//下一节点名称String nextnode = oConvertUtils.getString(map.get("nextnode"));//下一步节点的数目(小心歧义)Integer nextCodeCount = oConvertUtils.getInt(map.get("nextCodeCount"));
//		String way = oConvertUtils.getString(request.getParameter("way"));
//		ProcessHandle processHandle = activitiService.getProcessHandle(taskId);//模式类型(单/多分支模式/驳回模式)String model = oConvertUtils.getString(map.get("processModel"));//下一步操作人String nextUser = oConvertUtils.getString(map.get("nextUserId"));//驳回时选择驳回到哪一节点String rejectNode = oConvertUtils.getString(map.get("rejectModelNode"));String accomplishFlag = "";if (map.get("accomplishFlag") != null) {accomplishFlag = oConvertUtils.getString(map.get("accomplishFlag"));}//TODO 流程变量参数
//		Map<String, Object> varmap = var.getVariableMap(processHandle.getTpProcesspros());Map<String, Object> varmap = new HashMap<String, Object>();Task task = activitiService.getTask(taskId);if (task == null) {return Result.error("该节点为首节点,无法驳回");}String processInstanceId = task.getProcessInstanceId();runtimeService.setVariable(processInstanceId, WorkFlowGlobals.BPM_STATUS, WorkFlowGlobals.BPM_BUS_STATUS_2);runtimeService.setVariable(processInstanceId, "tenantId", request.getHeader("tenant_id"));List<String> nextUserList = Arrays.asList(nextUser.split(","));if (nextUserList != null && nextUserList.size() > 0) {runtimeService.setVariable(processInstanceId, "nextUser", nextUserList.get(0));}if (!"1".equals(model) && !"2".equals(model)) {// 取得所有历史任务按时间降序排序List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list();//查出离现在第二近的上一节点处理人String assignee = "";int i = 0;for (HistoricTaskInstance historicTaskInstance : htiList) {if (historicTaskInstance.getTaskDefinitionKey().equals(rejectNode)) {assignee = historicTaskInstance.getAssignee();i++;if (i == 2) {break;}}}runtimeService.setVariable(processInstanceId, "rejectNextBy", assignee);}boolean bflag = this.checkUserTaskIsHuiQian(taskId, nextnode);if (bflag) {varmap.put(WorkFlowGlobals.ASSIGNEE_USER_ID_LIST, nextUser);runtimeService.setVariable(processInstanceId, WorkFlowGlobals.ASSIGNEE_USER_ID_LIST, nextUser);if (!"".equals(accomplishFlag)) {varmap.put("accomplish_flag", accomplishFlag);}}//判断是否是委托任务,被委托人先解决委托if (StringUtils.isNotBlank(task.getOwner())) {DelegationState delegationState = task.getDelegationState();switch (delegationState) {case PENDING:taskService.resolveTask(taskId);break;case RESOLVED://委托任务已经完成break;default://不是委托任务break;}}String rejectDescription = "";if ("1".equals(model)) {//---update-begin-----autor:zhoujf------date:20190927-------for:并行网关停滞不前问题--------//判断是否是并行网关boolean isParallelGateway = this.checkParallelGateway(task.getProcessDefinitionId(), nextnode);//单分支模式if ("end".equals(nextnode)) {if (nextCodeCount == 1 || isParallelGateway) {taskService.complete(taskId, varmap);} else {activitiService.goProcessTaskNode(taskId, nextnode, varmap);}} else {//多分支模式if (nextCodeCount == 1 || isParallelGateway) {taskService.complete(taskId, varmap);} else {activitiService.goProcessTaskNode(taskId, nextnode, varmap);}//---update-end-----autor:zhoujf------date:20190927-------for:并行网关停滞不前问题--------//如果下个节点不是会签节点,动态指派下一步处理人if (!bflag) {//会签情况下,该SQL会报错String nextTskId = activitiService.getTaskIdByProins(processInstanceId, nextnode);//---update-begin-----autor:scott------date:20190925-------for:TASK #3188 下一步节点不是任务节点的情况下,不走指派逻辑不然报错。比如:下一步是个网关--------if (oConvertUtils.isNotEmpty(nextUser) && oConvertUtils.isNotEmpty(nextTskId)) {//---update-end-----autor:scott------date:20190925-------for:TASK #3188 下一步节点不是任务节点的情况下,不走指派逻辑不然报错。比如:下一步是个网关--------if (nextUser.indexOf(",") < 0) {//指定单个执行人taskService.setAssignee(nextTskId, nextUser);} else {//---update-begin-----autor:scott------date:20190925-------for:TASK #3187 【疑似BUG】 出差申请 下一步操作人 选择多个//指定多人taskService.setAssignee(nextTskId, null);for (String userid : nextUser.split(",")) {if (oConvertUtils.isNotEmpty(userid)) {taskService.addCandidateUser(nextTskId, userid);}}//---update-end-----autor:scott------date:20190925-------for:TASK #3187 【疑似BUG】 出差申请 下一步操作人 选择多个}}} else {runtimeService.setVariable(processInstanceId, "assigneeUserIdList", nextUser);}}} else if ("2".equals(model)) {//多分支模式taskService.complete(taskId, varmap);} else {runtimeService.setVariable(processInstanceId, WorkFlowGlobals.BPM_STATUS, WorkFlowGlobals.PROCESS_REJECTPROCESS_STATUS);//驳回模式activitiService.goProcessTaskNode(taskId, rejectNode, varmap);String nextTskId = activitiService.getTaskIdByProins(processInstanceId, rejectNode);// 取得所有历史任务按时间降序排序List<HistoricTaskInstance> htiList = historyService.createHistoricTaskInstanceQuery().processInstanceId(processInstanceId).orderByTaskCreateTime().desc().list();//查出离现在第二近的上一节点处理人String assignee = "";int i = 0;for (HistoricTaskInstance historicTaskInstance : htiList) {if (historicTaskInstance.getTaskDefinitionKey().equals(rejectNode)) {assignee = historicTaskInstance.getAssignee();i++;if (i == 2) {break;}}}
//				runtimeService.setVariable(processInstanceId,"rejectNextBy",assignee);//TODO  这行代码替换了下面注释的部分try {taskService.setAssignee(nextTskId, assignee);} catch (ActivitiIllegalArgumentException e) {log.info("taskId is null");}//				if(oConvertUtils.isNotEmpty(nextUser)){
//					if(nextUser.indexOf(",") < 0){
//						//指定单个执行人
//						taskService.setAssignee(nextTskId,nextUser);
//					}else{
//						//指定多人
//						taskService.setAssignee(nextTskId,null);
//						//---update-begin-----autor:scott------date:20190930------for:TASK #3187 【疑似BUG】 出差申请 下一步操作人 选择多个
//						for (String userid : nextUser.split(",")) {
//							if (oConvertUtils.isNotEmpty(userid)) {
//								taskService.addCandidateUser(nextTskId, userid);
//							}
//						}
//						//---update-end-----autor:scott------date:20190930-------for:TASK #3187 【疑似BUG】 出差申请 下一步操作人 选择多个
//					}
//				}//TODO  流程委托、驳回 日志问题Task nexttask = activitiService.getTask(nextTskId);//---update-begin-----autor:scott------date:20191203------for:驳回人显示真实名字,不显示账号String assigneeUserName = task.getAssignee();LoginUser loginUser = sysBaseAPI.getUserByName(task.getAssignee());if (loginUser != null) {assigneeUserName = loginUser.getRealname();}//---update-end-----autor:scott------date:20191203------for:驳回人显示真实名字,不显示账号rejectDescription = assigneeUserName + "驳回任务 〔" + task.getName() + "〕 →〔" + nexttask.getName() + "〕 ";
//				List<HistoricTaskInstance>  hiTaskInstList = historyService.createHistoricTaskInstanceQuery().taskId(taskId).list();
//				ActHiTaskinst actHiTaskinst = this.systemService.get(ActHiTaskinst.class, taskId);
//				actHiTaskinst.setDescription(rejectDescription);
//				actHiTaskinst.setDeleteReason(rejectDescription);
//				this.systemService.saveOrUpdate(actHiTaskinst);// 流程委托、驳回 日志问题}String username = JwtUtil.getUserNameByToken(request);LoginUser user = sysBaseAPI.getUserByName(username);// 任务抄送处理String ccUserNames = oConvertUtils.getString(map.get("ccUserIds"));//任务抄送记录taskCc(ccUserNames, task, username);//每个task节点执行完成后,处理审批日志ProcessInstance processInstance = runtimeService.createProcessInstanceQuery().processInstanceId(processInstanceId).singleResult();String reason = oConvertUtils.getString(map.get("reason"));ExtActBpmLog bpmlog = new ExtActBpmLog();if (processInstance != null) {bpmlog.setBusinessKey(processInstance.getBusinessKey());bpmlog.setProcName(processInstance.getName());}
//			bpmlog.setOpStatus(opStatus);bpmlog.setOpTime(new Date());
//			bpmlog.setOpType(WorkFlowGlobals.BPM_OP_TYPE_1);bpmlog.setOpUserId(username);if (user != null) {bpmlog.setOpUserName(user.getRealname());}bpmlog.setProcInstId(processInstanceId);if (oConvertUtils.isNotEmpty(rejectDescription)) {reason = reason + "       『 " + rejectDescription + " 』";}bpmlog.setRemarks(reason);bpmlog.setTaskDefKey(task.getTaskDefinitionKey());bpmlog.setTaskId(taskId);bpmlog.setTaskName(task.getName());extActBpmLogService.save(bpmlog);//保存附件String fileList = oConvertUtils.getString(map.get("fileList"));saveBpmFiles(bpmlog.getId(), fileList);} catch (BpmException e) {result.error500("任务执行失败:" + e.getMessage());e.printStackTrace();} catch (ActivitiException e) {result.error500("任务执行失败:" + e.getMessage());e.printStackTrace();Object actObj = e.getCause();if (actObj != null) {Throwable throwable = (Throwable) actObj;if (throwable.getCause() != null && throwable.getCause() instanceof BpmException) {result.error500("任务执行失败:" + throwable.getCause().getMessage());}}} catch (Exception e) {result.error500("任务执行失败:" + e.getMessage());e.printStackTrace();Object actObj = e.getCause();if (actObj != null) {Throwable throwable = (Throwable) actObj;if (throwable.getCause() != null && throwable.getCause() instanceof BpmException) {result.error500("任务执行失败:" + throwable.getCause().getMessage());}}}Long endTime = System.currentTimeMillis();log.debug("方法processComplete结束前,当前时间戳{}" + endTime);log.debug("耗时(毫秒):{}", endTime - startTime);return result;}

常用流程表介绍

1.历史节点表—act_hi_actinst
流程历史节点表常用来查询流程走过的节点
在这里插入图片描述

2.历史变量表—act_hi_varinst
流程历史节点表常用来查询流程走到的节点的元数据(业务数据)
在这里插入图片描述

3.运行时任务节点表—act_ru_lask
运行时加点表表明当前流程走到的节点

在这里插入图片描述

4.运行时流程变量数据表—act_ru_variable
运行时加点表表明当前流程走到的节点信息(业务数据)
在这里插入图片描述
5.流程部署信息表—act_re_deployment
流程部署后流程存储的地方—主要字段id(流程部署id)
在这里插入图片描述

6.流程定义数据表—act_re_prodef
流程定义
在这里插入图片描述

7.运行时流程人员表—act_ru_identitylink
每个节点的人员信息
在这里插入图片描述

8.运行时流程实例表—act_ru_execution
关键表,集合了流程实例id,流程定义id,流程节点id,以及业务表id
在这里插入图片描述

9.运行各个表之间的关系
表之间的关系以及字段

备注

流程实例id贯穿运行表,运行表业务字段,历史表,历史表业务字段,流程实例表,属于比较重要的字段


http://chatgpt.dhexx.cn/article/8qrhPpkk.shtml

相关文章

规则引擎和流程引擎我该怎么理解

流程引擎 什么是流程引擎 流程引擎就是“业务过程的部分或整体在计算机应用环境下的自动化”&#xff0c;它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实…

流程引擎:流程定义、流程实例、任务

流程引擎&#xff1a;流程定义、流程实例、任务 流程定义(ProcessDefinition) 基于bpmn2图形流程 流程实例(ProcessInstance) 一个流程定义可以启动多个流程实例,流程实例之间互不影响 流程实例任务(Tasks) 一个流程实例对应多个流程任务(人工与自动)

流程引擎(flowable)之流程相关

代码示例&#xff1a;流程部署/发布 InputStream inputStream new DefaultResourceLoader().getResource("classpath:BusinessProcessBeanTest.test.bpmn20.xml").getInputStream();Deployment deploy configuration.getRepositoryService().createDeployment()//…

流程引擎应用及分析

介绍&#xff1a;工作流引擎目前比较热门的有Activiti、Flowable等&#xff0c;Flowable是Activiti(Alfresco持有的注册商标)的fork版本。下面就两种工作流引擎做一个比较和入门分析。 模块一 对比&#xff1a; Activiti现存文档比Flowable多&#xff0c;有大量与业务集成的文…

《Flowable流程引擎从零到壹》Flowable流程引擎介绍和实战项目初始化流程引擎实例

14天学习训练营导师课程&#xff1a; 邓澎波《Flowable流程引擎-基础篇【2022版】》 邓澎波《Flowable流程引擎-高级篇【2022版】》 学习笔记《Flowable流程引擎从零到壹》回城传送 ❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。Java领域优质创…

流程引擎的架构设计

流程引擎的架构设计 1 什么是流程引擎 流程引擎是一个底层支撑平台&#xff0c;是为提供流程处理而开发设计的。流程引擎和流程应用&#xff0c;以及应用程序的关系如下图所示。 常见的支撑场景有&#xff1a;Workflow、BPM、流程编排等。本次分享&#xff0c;主要从 BPM 流程…

流程引擎是什么?有什么作用?

编者按&#xff1a;本文详细论述了流程引擎的概念&#xff0c;流程引擎的作用以及选型的要旨&#xff0c;并介绍了自主研发具有中国特色的流程引擎。 关键词&#xff1a;流程引擎&#xff0c;集成性&#xff0c;数据分析&#xff0c;BPMN2.0规范&#xff0c;中国特色&#xff…

流程引擎BPM对比

流程引擎定义 流程引擎就是“业务过程的部分或整体在计算机应用环境下的自动化”&#xff0c;它主要解决的是“使在多个参与者之间按照某种预定义的规则传递文档、信息或任务的过程自动进行&#xff0c;从而实现某个预期的业务目标&#xff0c;或者促使此目标的实现”。通俗的…

流程引擎camunda

简介 Camunda是一个基于Java的框架&#xff0c;支持用于工作流和流程自动化的BPMN、用于案例管理的CMMN和用于业务决策管理的DMN。笔者单位里主要是用于业务审批。 学习了解资料尽量去官方查看https://docs.camunda.org&#xff0c;查看版本7.18&#xff0c;一步一个环节比较详…

选对流程引擎,玩转流程设计不是梦

编者按&#xff1a;本文详细论述了流程引擎的概念&#xff0c;流程引擎选择的要旨&#xff0c;并介绍了流程引擎的应用场景。 流程引擎的概念流程引擎怎么选流程引擎能做什么 在这个数字化办公时代&#xff0c;流程设计对于企业管理者来具有重大意义&#xff0c;一个优秀的工作…

pojo类转换工具

每次pojo类转换的时候很麻烦&#xff0c;所以就在搜pojo类快速转换方法&#xff0c;突然发现一个比较好的pojo类转换工具mapstruct 。 项目中只需要添加如下依赖&#xff1a; 然后定义一个接口添加Mapper(componentModel "spring")注解 便可以直接使用该工具…

JOIOJI

JOIOJI (joioji.c/.cpp/.pas) 【问题描述】 JOIOJIさん是JOI君的叔叔。“JOIOJI”这个名字是由“J、O、I”三个字母各两个构成的。 最近&#xff0c;JOIOJIさん有了一个孩子。JOIOJIさん想让自己孩子的名字和自己一样由“J、O、I”三个字母构成&#xff0c;并且想让“J、O、…

ARM BTI指令介绍

目录 一、JOP 二、BTI 三、启用BTI 四、BTI是怎么实现的 一、JOP JOP&#xff08;Jump-oriented programming&#xff09;类似于ROP&#xff08;Return-Oriented Programming&#xff09;。在 ROP 攻击中&#xff0c;会扫描出useful gadgets&#xff08;易被攻击的一段代码…

Jopr介绍

转载文章请注明&#xff1a;转载自JBossWeek.com [ http://www.jbossweek.com] 如果您是一名系统管理员&#xff0c;正在承受着如下的煎熬&#xff1a;发疯地寻找配置某个服务的JBoss AS配置文件&#xff1b;痛苦地敲着冗长的JBoss管理命令行&#xff1b;眼花缭乱地在n个终端窗…

JOptionPane

JOptionPane提供了许多对话框样式&#xff0c;该类能够让你在不编写任何专门对话框代码的情况下弹出一个简单的对话框。 JOptionPane类提供了7个构造方法用于创建JOptionPane的类对象&#xff0c;不过在实际使用时&#xff0c; 通常不是用new方式创建&#xff0c;而是使用JOpti…

什么pojo

pojo&#xff08;Plain Ordinary Java Object&#xff09;&#xff1a;普通的Java对象&#xff0c;其实就是简单的JavaBean实体类。对应数据库里的某一张表&#xff0c;pojo里的每一个属性都和该表中的字段一 一对应。 POJO有一些private的参数作为对象的属性。然后针对每个参…

随机变量的期望和方差

X服从两点分布&#xff0c;则 X服从超几何分布&#xff0c;即 &#xff0c;则 X服从二项分布&#xff0c;即 &#xff0c;则 X服从泊松分布&#xff0c;即 &#xff0c;则 连续型 X服从均匀分布&#xff0c;即 &#xff0c;则 &#xff0c; X服从指数分布&#xff…

概率论 —— 相关分布以及期望方差的求法汇总

离散型 1. 两点分布&#xff08;伯努利分布&#xff09; 在一次试验中&#xff0c;事bai件A出现的概du率为P&#xff0c;事件A不出现的概率为ql -p&#xff0c;若以X记一次试zhi验中A出现的次数&#xff0c;则X仅取0、I两个值。 两点分布是试验次数为1的伯努利试验。 2. 二项…

概率论笔记(四)概率分布的下期望和方差的公式总结

文章目录 一&#xff1a;期望1.1离散型随机变量的期望1.2连续型随机变量的期望1.3期望的性质 二&#xff1a;随机变量函数&#xff08;复合随机&#xff09;的数学期望三&#xff1a;方差3.1离散型随机变量的方差3.2连续性随机变量的方差3.3方差的性质 四&#xff1a;协方差4.1…

概率论与数理统计:六大基本分布及其期望和方差

绪论&#xff1a; 概率论中有六大常用的基本分布&#xff0c;大致可分成两类&#xff1a;离散型&#xff08;0-1分布、二项分布、泊松分布&#xff09;&#xff0c;连续型&#xff08;均匀分布、指数分布、正态分布&#xff09;。 补充&#xff1a; 在进入正文之前先讲一下期…