首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Camunda的Camunda同步响应

使用Camunda的Camunda同步响应
EN

Stack Overflow用户
提问于 2017-02-13 08:57:31
回答 3查看 2.3K关注 0票数 2

是否可以使用Camunda从Camunda流获得同步响应?

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

1. Validate Address

2. Get ProductList

现在,我开始使用Camunda提供的REST (不使用驾驶舱启动该过程)。执行地址验证服务任务,成功地执行ProductList任务,并在调用客户端的响应中返回它的i.e. List of products响应,而不是使用process挖掘camunda。我搜索了它,但没有找到任何这样的例子,也没有找到它。

EN

回答 3

Stack Overflow用户

发布于 2017-02-27 11:49:07

我已经阅读了REST文档,没有其他方法可以从REST获得实际响应(即List of Product),因为rest调用的返回类型如下-

代码语言:javascript
复制
    {
      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创建过程

现在,如果用户想从进程中读取参数,那么需要调用历史服务,因为进程是同步的和结束的。

GET /history/variable-instance,有关更多选项,请参见过程历史变量

票数 1
EN

Stack Overflow用户

发布于 2017-02-15 17:58:11

我看不出用rest做这件事的方法,即使是在没有额外查询和过程变量的情况下,嵌入式流程引擎也是有点棘手的。

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

代码语言:javascript
复制
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启动进程之前,您将初始化上下文,然后从上下文中检索结果:

代码语言:javascript
复制
final Context context = new Context("address");
CurrentContext.set(context);
try {

    runtimeService.startProcessInstanceById(...);

    return context.getProducts();
} finally {
    CurrentContext.remove();
}

我们正在非常成功地使用此模式(使用由自定义spring作用域管理的上下文)。

票数 0
EN

Stack Overflow用户

发布于 2021-06-05 22:11:45

根据我的理解,进程应该始终被看作是可以被异步处理的东西。由于这个原因,我会检查备选方案,而不是试图从进程开始时直接获得结果。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42200074

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档