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

如何编写返回字符串的简易Java API并在Camunda服务任务中调用

Camunda 服务任务调用自定义逻辑获取payeeavg变量实现方案

现有代码问题修复

你当前的Servlet代码存在几处语法和逻辑错误,修复后可以正常作为外部任务Worker运行:

@WebServlet("/Avg")
public class Avg extends HttpServlet{
    private static final long serialVersionUID =1L;
    // 定义Worker ID,同一类Worker建议使用固定标识
    private static final String WORKER_ID = "payeeavg-calculate-worker";

    @Override
    protected void doGet(HttpServletRequest req,HttpServletResponse resp) throws ServletException,IOException{
        ProcessEngine engine = BpmPlatform.getDefaultProcessEngine();
        // 抓取并锁定payeeavg主题的外部任务
        List<LockedExternalTask> tasks = engine.getExternalTaskService()
                .fetchAndLock(1, WORKER_ID)
                .topic("payeeavg", 2000)
                .execute();
        // 先判断是否抓取到任务,避免空指针
        if(tasks.isEmpty()){
            resp.getWriter().write("no pending payeeavg task");
            return;
        }
        LockedExternalTask lockedExternalTask = tasks.get(0);
        // 生成payeeavg值,接住format返回结果
        Random rnd = new Random();
        int number = rnd.nextInt(999999);
        String payeeavg = String.format("%06d", number+50000);
        // 完成任务时将payeeavg变量传回流程引擎
        engine.getExternalTaskService()
                .complete(lockedExternalTask.getId(), WORKER_ID, 
                        Map.of("payeeavg", payeeavg));
        resp.getWriter().write("task completed, payeeavg: "+payeeavg);
    }
}

与Camunda流程关联配置

要让上述代码生效,需要在BPMN流程中对对应的服务任务做如下配置:

  • 打开Camunda Modeler,选中你要触发计算payeeavg的服务任务
  • 右侧属性面板的「实现」下拉框选择 External
  • 「Topic」输入框填写 payeeavg,和代码中topic参数完全一致
  • 保存并重新部署流程即可
    当流程运行到该服务任务时,会自动创建主题为payeeavg的外部任务,你调用/Avg接口就会触发任务抓取、计算、回传变量的逻辑,后续流程节点可以直接通过execution.getVariable("payeeavg")获取到生成的字符串值。

更简易的实现方案(无需外部任务/Servlet)

如果你的逻辑不需要异步执行、不需要独立Worker部署,直接使用Java Delegate实现更简单:

  1. 编写Delegate类
import org.camunda.bpm.engine.delegate.DelegateExecution;
import org.camunda.bpm.engine.delegate.JavaDelegate;
import java.util.Random;

public class CalculatePayeeavgDelegate implements JavaDelegate {
    @Override
    public void execute(DelegateExecution execution) throws Exception {
        Random rnd = new Random();
        int number = rnd.nextInt(999999);
        String payeeavg = String.format("%06d", number+50000);
        // 直接将变量存入流程上下文
        execution.setVariable("payeeavg", payeeavg);
    }
}
  1. 服务任务配置
  • 选中服务任务,右侧属性面板「实现」下拉框选择 Java Class
  • 「Java Class」输入框填写上述类的全限定类名(比如com.yourpackage.CalculatePayeeavgDelegate)
  • 部署流程后,流程运行到该节点会自动执行上述逻辑,直接生成payeeavg变量存入流程上下文。

内容的提问来源于stack exchange,提问作者Ano

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 01:45:01