You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在不使用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的completeJobs API完成对应作业,同步更新数据库任务状态为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 04:25:16