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进程可以在服务进程完成之前通知端点(使用数据的某些标识符作为回调的一部分和结果(。