如何在不使用Tasklist的情况下实现Camunda 8任务列表获取及认领?
基于Zeebe实现人工任务管理(替代Camunda 8官方Tasklist生产方案)
核心思路
Camunda 8官方Tasklist仅支持开发测试环境使用,生产环境需基于Zeebe原生API搭建自定义人工任务流——核心是将人工任务定义为特殊的Zeebe作业(Job),通过自定义任务类型+自建持久化存储实现人工认领、查询、完成等能力,完全绕开商业许可限制。
具体实现步骤
1. 在BPMN中定义人工任务节点
使用zeebe:taskDefinition指定自定义任务类型(如user-task),并通过zeebe:taskHeaders传递任务业务参数(标题、描述、候选用户组等):
<bpmn:serviceTask id="OrderReviewTask" name="订单审核"> <bpmn:extensionElements> <zeebe:taskDefinition type="user-task" /> <zeebe:taskHeaders> <zeebe:header key="title" value="订单审核" /> <zeebe:header key="description" value="请核对用户订单的商品与金额信息" /> <zeebe:header key="candidateGroups" value="operation,finance" /> </zeebe:taskHeaders> </bpmn:extensionElements> </bpmn:serviceTask>
2. 搭建自定义任务Worker与持久化层
创建监听user-task类型的Zeebe Worker,当Zeebe分发这类作业时,不直接处理,而是将任务元数据写入自建数据库(如PostgreSQL),存储结构需包含:
- 任务ID(关联Zeebe作业ID)
- 流程实例ID
- 任务标题、描述、候选用户/组
- 认领状态(未认领/已认领/已完成)
- 认领人ID
- 创建/更新时间
示例Worker伪代码(Java):
ZeebeClient zeebeClient = ZeebeClient.newClientBuilder() .gatewayAddress("zeebe-gateway:26500") .build(); zeebeClient.newWorker() .jobType("user-task") .handler((jobClient, job) -> { // 提取任务元数据 Map<String, String> headers = job.getCustomHeaders(); String taskId = job.getKey().toString(); String processInstanceId = job.getProcessInstanceKey().toString(); // 写入自定义数据库 UserTask task = new UserTask(); task.setTaskId(taskId); task.setProcessInstanceId(processInstanceId); task.setTitle(headers.get("title")); task.setDescription(headers.get("description")); task.setCandidateGroups(headers.get("candidateGroups")); task.setStatus("UNASSIGNED"); userTaskRepository.save(task); // 设置重试次数为0,避免Zeebe重复分发任务,等待人工操作后再完成 jobClient.newFailCommand(job.getKey()) .retries(0) .send() .join(); }) .open();
3. 实现人工任务UI核心功能
基于自建数据库开发前端界面,覆盖以下核心操作:
- 任务查询:根据用户所属组、认领状态过滤任务
- 任务认领:用户认领时,更新数据库任务状态为
ASSIGNED并记录认领人 - 任务完成:用户提交结果后,调用Zeebe的
completeJobsAPI完成对应作业,同步更新数据库任务状态为COMPLETED
任务完成伪代码:
public void completeUserTask(String taskId, Map<String, Object> resultVariables) { // 从数据库获取关联的Zeebe作业ID UserTask task = userTaskRepository.findByTaskId(taskId); long jobKey = Long.parseLong(task.getTaskId()); // 完成Zeebe作业,传递业务结果变量 zeebeClient.newCompleteCommand(jobKey) .variables(resultVariables) .send() .join(); // 更新数据库任务状态 task.setStatus("COMPLETED"); userTaskRepository.save(task); }
4. 异常与超时处理
- 定时扫描数据库中超时未处理的任务,重新设置Zeebe作业的重试次数,实现任务转派或重新分发
- 若Worker写入数据库失败,设置合理重试次数,避免任务丢失
关键说明
官方Tasklist本质也是基于Zeebe的作业机制封装,但额外加入了商业许可限制的认领、查询功能;自建方案完全基于开源Zeebe API开发,可100%适配自身业务的权限体系与任务流转规则,但需要自行维护持久化存储与UI。
内容的提问来源于stack exchange,提问作者rj93
相关产品推荐
相关产品推荐

