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进行流程设计、部署、启动、任务管理和流程控制等操作,包括创建流程定义、启动流程实例、完成任务、查询流程状态和异常处理。同时展示了如何通过API调用完成流程引擎的基本功能,如流程定义的部署、流程实例的启动、任务的分配和完成,以及流程执行过程中的异常捕获。此外,还涉及到流程图片的获取、特定条件下的任务查询和任务的自动触发等高级特性。
977

被折叠的 条评论
为什么被折叠?



