ProcessEngine processEngine = ProcessEngines.getDefaultProcessEngine(); RepositoryService repositoryService = processEngine.getRepositoryService(); repositoryService.createDeployment() .addClasspathResource("org/activiti/test/VacationRequest.bpmn20.xml") .deploy(); Log.info("Number of process definitions: " + repositoryService.createProcessDefinitionQuery().count()); //当流程引擎重启时仍然可以获得以发布的流程
//-------------------------------启动一个流程实例---------------------------------------------------------- Map < String, Object > variables = new HashMap < String, Object > (); variables.put("employeeName", "Kermit"); variables.put("numberOfDays", new Integer(4)); variables.put("vacationMotivation", "I'm really tired!"); RuntimeService runtimeService = processEngine.getRuntimeService(); ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("vacationRequest", variables); // Verify that we started a new process instance Log.info("Number of process instances: " + runtimeService.createProcessInstanceQuery().count()); // 所有与流程运行状态相关的东西都可以通过RuntimeService获得。
// -----------------------------完成任务---------------------------------------------------------- TaskService taskService = processEngine.getTaskService(); List < Task > tasks = taskService.createTaskQuery().taskCandidateGroup("management").list(); for (Task task: tasks) { Log.info("Task available: " + task.getName()); } Task task = tasks.get(0); Map < String, Object > taskVariables = new HashMap < String, Object > (); taskVariables.put("vacationApproved", "false"); taskVariables.put("managerMotivation", "We have a tight deadline!"); taskService.complete(task.getId(), taskVariables); //---------------------------------------------------------------------------------------- // 当挂起流程定时时, 就不能创建新流程了(会抛出一个异常)。 可以通过RepositoryService挂起一个流程: repositoryService.suspendProcessDefinitionByKey("vacationRequest"); try { runtimeService.startProcessInstanceByKey("vacationRequest"); } catch (ActivitiException e) { e.printStackTrace(); } //-------------------------------------------查询篇------------------------------------------- List < Task > tasks = taskService.createTaskQuery() .taskAssignee("kermit") .processVariableValueEquals("orderId", "0815") .orderByDueDate().asc() .list(); List < Task > tasks = taskService.createNativeTaskQuery() .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T WHERE T.NAME_ = #{taskName}") .parameter("taskName", "gonzoTask") .list(); long count = taskService.createNativeTaskQuery() .sql("SELECT count(*) FROM " + managementService.getTableName(Task.class) + " T1, " + managementService.getTableName(VariableInstanceEntity.class) + " V1 WHERE V1.TASK_ID_ = T1.ID_") .count(); //*-------------------------------------------------------------------------------- 获取流程图片 ProcessDefinition processDefinition = repositoryService.createProcessDefinitionQuery() .processDefinitionKey("expense") .singleResult(); String diagramResourceName = processDefinition.getDiagramResourceName(); InputStream imageStream = repositoryService.getResourceAsStream(processDefinition.getDeploymentId(), diagramResourceName); < property name = "createDiagramOnDeploy" value = "false" / > //部署的时候,并不需要或者不必要生成流程定义图片 <!-- process元素有两个属性: id:这个属性是必须的, ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("process_id"); Activiti引擎在发布时自动生成的 id---processDefinition.getId()方法获得这个值成的 id的格式为 'key:version'最大长度限制为 64个字符 name:这个属性是可选的,对应 ProcessDefinition的 name属性。 = 注意所有与Activiti引擎的交互都是通过 services = --> 发布一个新流程 Deployment deployment = repositoryService.createDeployment().addClasspathResource("FinancialReportProcess.bpmn20.xml").deploy(); 启动一个流程实例 <!--process id=fnancialReport--> ProcessInstance processInstance = runtimeService.startProcessInstanceByKey("financialReport"); 用户登录之后获取任务 List < Task > tasks = taskService.createTaskQuery().taskCandidateUser("kermit").list(); //可使用session中的用户ID //传入的用户必须是accountancy组的一个成 //获取特定组内的成员列表 TaskService taskService = processEngine.getTaskService(); List < Task > tasks = taskService.createTaskQuery().taskCandidateGroup("accountancy").list(); //认领这个任务 === === === === = 任务签收user_ID === === === = taskService.claim(task.getId(), "fozzie"); List < Task > tasks = taskService.createTaskQuery().taskAssignee("fozzie").list(); //个人已签收任务列表 //完成任务 taskService.complete(task.getId()); //结束流程 HistoryService historyService = processEngine.getHistoryService(); HistoricProcessInstance historicProcessInstance = historyService.createHistoricProcessInstanceQuery().processInstanceId(procId).singleResult(); System.out.println("Process instance end time: " + historicProcessInstance.getEndTime()); // 定时器事件定义 //timeDate < timerEventDefinition > < timeDate > 2011 - 03 - 11T12: 13: 14 < /timeDate> </timerEventDefinition > 流程会启动4次,每次间隔5分钟,从2011年3月11日,12:13开始计时。 <startEvent id="theStart"> <timerEventDefinition> <timeCycle>R4/2011-03-11T12:13/PT5M</timeCycle> </timerEventDefinition> </startEvent> // timeDuration 指定定时器之前要等待多长时间 < timerEventDefinition > < timeDuration > P10D < /timeDuration> </timerEventDefinition > //timeCycle。指定重复执行的间隔 <!--每5分钟执行一次:0 0/5 * * * ? --> < timerEventDefinition > < timeCycle > R3 / PT10H < /timeCycle> </timerEventDefinition > 触发信号事件 既可以通过bpmn节点由流程实例触发一个信号,也可以通过 API触发。下面的 org.activiti.engine.RuntimeService中的方法可以用来手工触发一个信号。 RuntimeService.signalEventReceived(String signalName); RuntimeService.signalEventReceived(String signalName, String executionId); signalEventReceived(String signalName);和 signalEventReceived(String signalName, String executionId);之间的区别是第一个方法会把信号发送给全局所有订阅的处理器(广播语义),第二个方法只把信息发送给指定的执行。 // 报表 <scriptTask id="generateDataset" name="Execute script" scriptFormat="js" activiti:autoStoreVariables="false"> <script><![CDATA[ importPackage(java.sql); importPackage(java.lang); importPackage(org.activiti.explorer.reporting); var result = ReportingUtil.executeSelectSqlQuery("SELECT PD.NAME_, PD.VERSION_ , count(*) FROM ACT_HI_PROCINST PI inner join ACT_RE_PROCDEF PD on PI.PROC_DEF_ID_ = PD.ID_ group by PROC_DEF_ID_"); var reportData = new ReportData; var dataset = reportData.newDataset(); dataset.type = "pieChart"; dataset.description = "Process instance overview (" + new java.util.Date() + ")" while (result.next()) { // process results one row at a time var name = result.getString(1); var version = result.getLong(2); var count = result.getLong(3); dataset.add(name + " (v" + version + ")", count); } execution.setVariable("reportData", reportData.toBytes()); ]]></script> </scriptTask>
使用工作流基本都依赖早期的数据架构,依赖实际组织结构进行查找 (组织机构与权限问题)
activiti 笔记
最新推荐文章于 2022-10-10 20:02:27 发布