1 java business-process-management task camunda
为了开发自定义 BPM 应用程序,我们与另一个 BPM 引擎提供商一起使用了一项功能,并且也喜欢将其与 camunda 一起使用。\n目标功能是将正在运行的流程实例设置/重置为除当前活动任务之外的指定任务。从我们的角度来看,必要时,例如:
\n\n最后,我并没有真正找到一个简单的函数来执行此操作,而是编写了一些具有一些限制的自定义代码。该代码中存在一些弱点和不确定性,因此我有以下问题:
\n\n我是否错过了实现此目的的替代方法,或者以下方法是否正确,或者目前是否完全不受支持?
\n\n恕我直言,目前的弱点:
\n\n这是代码(我们的 camunda 服务门面的实验片段):
\n\n@Inject\nprotected HistoryService histService;\n@Inject\nprotected TaskService taskService;\n@Inject\nprotected ManagementService managementService;\n@Inject\nprotected RuntimeService runtimeService;\n@Inject\nprotected IdentityService identityService;\n@Inject\nprotected RepositoryService repositoryService;\n@Inject\nprotected FormService formService;\n@Inject\nprotected ProcessEngine processEngine;\n\n\npublic void startTask(String processInstanceId, String taskKey) {\n Collection<TaskDefinition> taskDefs = getAvailableTasks(\n processInstanceId);\n TaskEntity newTask = null;\n TaskDefinition taskDef = null;\n for (TaskDefinition taskDefinition : taskDefs) {\n if (taskDefinition.getKey().equals(taskKey)) {\n taskDef = taskDefinition;\n break;\n }\n }\n boolean taskDefExists = taskDef != null;\n List<Task> runningTasksByKey = getTasksByKey(taskKey, processInstanceId);\n boolean taskIsAlreadyRunning = runningTasksByKey != null\n && runningTasksByKey.size() > 0;\n if (taskDefExists && !taskIsAlreadyRunning) {\n newTask = (TaskEntity) taskService.newTask();\n ProcessInstance procInst = getProcessInstance(processInstanceId);\n ExecutionEntity procInstEntity = (ExecutionEntity) procInst;\n String taskName = (String) taskDef.getNameExpression().\n getExpressionText();\n// String taskAssigne = (String) taskDef.getAssigneeExpression().\n// getValue(\n// procInstEntity);\n// newTask.setAssignee(taskAssigne);\n newTask.setTaskDefinitionKey(taskDef.getKey());\n newTask.setProcessInstance(procInstEntity);\n newTask.setTaskDefinition(taskDef);\n newTask.setName(taskName);\n newTask.setProcessInstanceId(processInstanceId);\n newTask.setProcessDefinitionId(procInstEntity.\n getProcessDefinitionId());\n taskService.saveTask(newTask);\n\n TaskServiceImpl taskServiceImpl = (TaskServiceImpl) BpmPlatform.\n getProcessEngineService().getDefaultProcessEngine().\n getTaskService();\n CommandExecutor commandExecutor = taskServiceImpl.\n getCommandExecutor();\n ExecutionEntity executionEntity = commandExecutor.execute(\n new SaveTaskActivityInstanceCmd(newTask,\n procInstEntity));\n// commandExecutor.execute(new `SaveTaskHistoricActivityInstanceCmd(executionEntity, newTask));`\n }\n}\n\npublic Collection<TaskDefinition> getAvailableTasks(String processInstanceId) {\n Map<String, TaskDefinition> taskDefs = null;\n Collection<TaskDefinition> taskDefObjects = null;\n if (processInstanceId != null) {\n ProcessInstanceQuery procInstQuery = runtimeService.\n createProcessInstanceQuery().processInstanceId(\n processInstanceId);\n ProcessDefinitionEntity procDefEntity = getProcessDefinitionEager(\n processInstanceId);\n taskDefs = procDefEntity.getTaskDefinitions();\n }\n taskDefObjects = (Collection<TaskDefinition>) (taskDefs != null ? taskDefs.\n values() : new ArrayList<TaskDefinition>());\n return taskDefObjects;\n}\n\npublic ProcessDefinitionEntity getProcessDefinitionEager(\n String processInstanceId) {\n ProcessInstanceQuery procInstQuery = runtimeService.\n createProcessInstanceQuery().processInstanceId(\n processInstanceId);\n ProcessInstance procInst = procInstQuery.singleResult();\n String procDefId = procInst.getProcessDefinitionId();\n return (ProcessDefinitionEntity) repositoryService.getProcessDefinition(\n procDefId);\n}\n\npublic List<Task> getTasksByKey(String taskKey, String processInstanceId) {\n List<Task> tasks = taskService.createTaskQuery().processInstanceId(\n processInstanceId).taskDefinitionKey(taskKey).list();\n return tasks;\n}\n\n\npublic class SaveTaskActivityInstanceCmd implements Command<ExecutionEntity>, \n Serializable {\n\n private TaskEntity newTask;\n private ExecutionEntity procInstEntity;\n\n public SaveTaskActivityInstanceCmd(TaskEntity newTaskInit,\n ExecutionEntity procInstEntityInit) {\n this.newTask = newTaskInit;\n this.procInstEntity = procInstEntityInit;\n }\n\n\n public ExecutionEntity execute(CommandContext commandContext) {\n ActivityImpl actImpl = new ActivityImpl(newTask.\n getTaskDefinitionKey(),\n procInstEntity.getProcessDefinition());\n actImpl.setActivityBehavior(new UserTaskActivityBehavior(\n new CdiExpressionManager(), newTask.getTaskDefinition()));\n ExecutionEntity execEntity = new ExecutionEntity();\n execEntity.setActivity(actImpl);\n execEntity.setActivityInstanceId(newTask.getTaskDefinitionKey()\n + ":" + newTask.getId());\n execEntity.setEventName(newTask.getEventName());\n execEntity.setProcessDefinitionId(newTask.getProcessDefinitionId());\n execEntity.setActive(true);\n execEntity.setProcessInstance(procInstEntity);\n commandContext.getExecutionManager().insert(execEntity);\n return execEntity;\n }\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我很感激任何提示或建议:-)
\n从 Camunda 7.3 开始,您可以使用流程实例修改来启动流程中的任何活动并取消任何活动的活动实例。
例子:
runtimeService.createProcessInstanceModification(processInstanceId)
.startBeforeActivity("someActivityId")
.cancelActivityInstance("someActivityInstanceId")
.execute();
Run Code Online (Sandbox Code Playgroud)
有关文档,请参阅http://docs.camunda.org/7.3/guides/user-guide/#process-engine-process-instance-modification。
| 归档时间: |
|
| 查看次数: |
4454 次 |
| 最近记录: |