2017-02-13 6 views
2

Возможно ли получить синхронный отклик от потока Camunda BPMN с помощью API Camunda REST?Синхронный отклик Camunda BMPN с использованием API-интерфейса Camunda REST

Например, у меня есть 2 задачи обслуживания,

1. Validate Address,

2. Get ProductList.

Теперь я начинаю процесс с REST API, предоставляемый Camunda (Не использовать кабину для запуска процесса). Выполняется задание службы проверки адреса, задача ProductList выполнена успешно и ответ i.e. List of products будет возвращен в ответ вызывающего клиента вместо того, чтобы копать в camunda с идентификатором процесса. Я их искал, но не нашел такого примера или не привел к нему.

ответ

0

Я не вижу способа сделать это с помощью всего лишь 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(); 
} 

Мы используем эту модель (с контекстом, управляемым обычаем весна scope) довольно успешно.

+0

Куда уходит последний фрагмент кода. Я только начинаю и учась на части REST и исследую другую область. – Swaraj

+0

@Swaraj Извините, я пропустил требование об использовании остального api, в приведенном выше примере используется java api встроенного процесса. –

+0

Спасибо, это поможет при работе с API Camunda. Но одна вещь, которую я узнал, не может получить фактический ответ от REST API, вместо этого нужно использовать processInstanceID/Business Key для получения более подробной информации из экземпляра процесса с использованием REST API. – Swaraj

0

Я прошел через документации REST, нет другого пути, чтобы получить реальный ответ, (т.е. List of Product) с REST API в качестве возвращаемого типа вызова отдыха, как тип возвращаемого значения в следующем формате -

{ 
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 Create Process

Теперь, если пользователь хочет, чтобы прочитать параметры из процесса, то необходимо обратиться в службе истории, как этот процесс был синхронным и закончился ,

GET /history/variable-instance, см. Process History Variables Дополнительные параметры.

Смежные вопросы