Camunda BMPN Synchronous Response using Camunda REST API


是否可以使用 Camunda

REST API 从 Camunda BPMN 流获得同步响应?

例如,我有 2 个服务任务,

1. Validate Address

2. Get ProductList .

现在我正在使用Camunda提供的REST API开始该过程(不使用Cockpit来启动该过程(。地址验证服务任务执行,产品列表任务成功执行,它的响应i.e. List of products,将在调用客户端的响应中返回,而不是使用进程 ID 挖掘 camunda。我搜索了它,但没有找到任何这样的例子或导致它。

我已经

浏览了 REST 文档,没有其他方法可以从 REST API 获取实际响应(即List of Product(作为 rest 调用的返回类型,因为返回类型采用以下格式 -

    {
      id: "95aef406-3a7a-11e5-85b6-dafa20524153",
      definitionId: "invoice:1:15e97a1c-312d-11e5-aca3-a0e120524153",
      businessKey: null,
      caseInstanceId: null,
      ended: true,
      suspended: false
    }

它显示进程已结束(ended: true(,因为所有调用都是同步的,Camunda Rest 创建进程

现在,如果用户想要从进程中读取参数,则需要调用历史记录服务,因为进程已同步并已结束。

GET /history/variable-instance , 参见进程历史记录变量以获取更多选项。

我看不出仅使用其余 API 的方法,即使使用嵌入式进程引擎,在没有其他查询和流程变量的情况下做到这一点也有点棘手。

解决此问题的一种方法是引入一个"上下文"对象,该对象由依赖注入框架管理或作为简单的ThreadLocal进行管理。此上下文将包含输入和输出参数,并且可以在启动进程时以及从服务任务访问。

class Context {
    private String address;
    private List<String> products;
    public Context(String address) { this.address = address; }
    public String getAddress() { return address; }
    public void setAddress(String address) { this.address = address; }
    public List<String> getProducts() { return products; }
    public void setProducts(List<String> products) { this.products = products; }
}
class CurrentContext {
    private static final ThreadLocal<Context> value = new ThreadLocal<>();
    public static void set(Context context) {
        value.set(context);
    }
    public static Context get() {
        return value.get();
    }
    public static void remove() {
        value.remove();
    }
}
class GetProductList implements JavaDelegate {
    @Override
    public void execute(final DelegateExecution execution) {
        final Context context = CurrentContext.get();
        context.setProducts(getProducts(context.getAddress()));
    }
}

在使用 java API 开始该过程之前,您需要初始化上下文,然后从上下文中检索结果:

final Context context = new Context("address");
CurrentContext.set(context);
try {
    runtimeService.startProcessInstanceById(...);
    return context.getProducts();
} finally {
    CurrentContext.remove();
}

我们非常成功地使用了这种模式(上下文由自定义弹簧范围管理(。

在我的理解中,一个过程应该始终被视为可以异步处理的东西。出于这个原因,我会检查替代方案,而不是试图直接从流程开始获得结果。

一种常见的方法是应用程序提供一个充当回调处理程序的 Web 端点(例如 HTTP GET 端点(。Camunda进程可以在服务进程完成之前通知端点(使用数据的某些标识符作为回调的一部分和结果(。

最新更新