如何编写返回字符串的简易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实现更简单:
- 编写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); } }
- 服务任务配置
- 选中服务任务,右侧属性面板「实现」下拉框选择 Java Class
- 「Java Class」输入框填写上述类的全限定类名(比如
com.yourpackage.CalculatePayeeavgDelegate) - 部署流程后,流程运行到该节点会自动执行上述逻辑,直接生成payeeavg变量存入流程上下文。
内容的提问来源于stack exchange,提问作者Ano
相关产品推荐
相关产品推荐

