在 spring boot 中完成 camunda 用户任务
Complete camunda user task on springboot
我有一个 运行 使用 spring 启动的 Camunda 服务器,我可以在我的本地主机上点击它的 API 来启动一个进程,完成用户任务等。
我正在寻找一种从 Camunda 服务器内完成用户任务的方法。我找到了一种启动流程的方法:
runtimeService.startProcessInstanceById(processName, variables);
但是,我找不到有关如何完成流程的信息。如果我使用其余的 API 它将分两步完成:
- 使用
localhost:8080/engine-rest/task?definitionKey={{taskDefinitionKey}}&processInstanceId={{processInstanceId}}
获取任务ID
- 完成POST到
localhost:8080/engine-rest/task/{{taskId}}/complete
的任务
如何从 java 代码(而不是 API)中执行相同的操作?因为通过 Rest API 调用自身功能而不是调用代码很奇怪。我相信 Rest API 正在调用系统中的一些代码,我想直接使用它而不是使用 API。我搜索了 Camunda 文档,但没有找到任何内容。
我的情况是,当接收到特定消息时,此 Camunda 服务器将侦听消息代理并启动进程或完成用户任务等。
我找到方法了,我可以这样做:
public void completeUserTask(String processInstanceId, String taskName, Map<String, Object> variables) {
// taskService is instance of org.camunda.bpm.engine.TaskService
String taskId = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.list()
.stream()
.filter(task -> task.getTaskDefinitionKey().equals(taskName))
.findFirst()
.orElseThrow(() -> new RuntimeException(
String.format("Could not find task with name %s on processInstanceId %s",
taskName,
processInstanceId))).getId();
taskService.complete(taskId, variables);
}
这将是一个更好的解决方案,因为它在数据库级别进行过滤,而不是遍历客户端上找到的所有任务。它也更简单,只考虑活动任务。
String taskId = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.taskDefinitionKey(taskName)
.active().singleResult().getId();
我有一个 运行 使用 spring 启动的 Camunda 服务器,我可以在我的本地主机上点击它的 API 来启动一个进程,完成用户任务等。 我正在寻找一种从 Camunda 服务器内完成用户任务的方法。我找到了一种启动流程的方法:
runtimeService.startProcessInstanceById(processName, variables);
但是,我找不到有关如何完成流程的信息。如果我使用其余的 API 它将分两步完成:
- 使用
localhost:8080/engine-rest/task?definitionKey={{taskDefinitionKey}}&processInstanceId={{processInstanceId}}
获取任务ID
- 完成POST到
localhost:8080/engine-rest/task/{{taskId}}/complete
的任务
如何从 java 代码(而不是 API)中执行相同的操作?因为通过 Rest API 调用自身功能而不是调用代码很奇怪。我相信 Rest API 正在调用系统中的一些代码,我想直接使用它而不是使用 API。我搜索了 Camunda 文档,但没有找到任何内容。
我的情况是,当接收到特定消息时,此 Camunda 服务器将侦听消息代理并启动进程或完成用户任务等。
我找到方法了,我可以这样做:
public void completeUserTask(String processInstanceId, String taskName, Map<String, Object> variables) {
// taskService is instance of org.camunda.bpm.engine.TaskService
String taskId = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.list()
.stream()
.filter(task -> task.getTaskDefinitionKey().equals(taskName))
.findFirst()
.orElseThrow(() -> new RuntimeException(
String.format("Could not find task with name %s on processInstanceId %s",
taskName,
processInstanceId))).getId();
taskService.complete(taskId, variables);
}
这将是一个更好的解决方案,因为它在数据库级别进行过滤,而不是遍历客户端上找到的所有任务。它也更简单,只考虑活动任务。
String taskId = taskService.createTaskQuery()
.processInstanceId(processInstanceId)
.taskDefinitionKey(taskName)
.active().singleResult().getId();