2013-10-11 6 views
2

Мы моделируем процессы с удвоением и выполняем упомянутые bpm с помощью двигателя camunda в среде Spring. В одном сценарии я хотел бы выполнить собственный Java-код между двумя пользовательскими задачами. Мой вывод о том, что я прочитал большую часть документации по камунде, - это то, что я лучше всего использую концепцию Service-Task.Задачи службы Camunda/Activity Service

Я хотел бы сделать две вещи, одна для хранения более одного процесса-переменной с задачей службы и два, чтобы динамически определить, какие карты переменных процесса, к которому входной параметр Службы-Task

Насколько мне известно, Camunda предлагает два способа интеграции Java-кода с сервисными задачами:

1.) Объявите Spring-компонент, реализующий интерфейс JavaDelegate. (Метод получает параметр DelegateExecution в качестве параметра). Это позволило бы мне хранить столько переменных результата, сколько мне нравится, но я не вижу возможности определять переменную-переменную-переменную-> input-variable.

2.) Объявите общий элемент Spring bean доступным для camunda и определите метод этого компонента, который будет выполняться системной задачей. Это позволяет мне указывать шаблон переменной-переменной -> input-variable через определение bpm, но сохраняет не более одной переменной результата.

Итак, есть ли способ достичь обоих?

Разъяснение

Для уточнения своих требований, по поводу моих систем-задачи могут обнаружить несогласованное состояние (в переменных базах данных или процесса). Я хотел бы, чтобы задачи сохраняли код ошибки (аналогично кодам ошибок программ «exit (1)») в переменных процесса, чтобы следующие пользовательские задачи получили возможность исправить ошибку. Этот код ошибки также может быть сохранен в фиксированном месте в переменных процесса, однако я хочу иметь возможность поместить хотя бы один «реальный результат» в указанное место.

+0

Не совсем уверен, что вы хотели бы для того чтобы достигнуть. Вы хотите создать/обновить несколько переменных процесса из реализации служебной задачи? И откуда должно поступать входное отображение? – nre

ответ

2

Вы должны иметь возможность реализовать поведение в компоненте Spring, который использует текущее выполнение для чтения и обновления переменных.

Вы бы телеграфировать пружинный боб имени myErrorHandler с задачей обслуживания, как этот

<serviceTask id="checkError" 
      camunda:expression="#{myErrorHandler.checkError(execution)}" /> 

The execution переменная доступна в выражении по-умолчанию и указывает на экземпляр DelegateExecution, что дает вам доступ к текущему процессу переменные.

Реализация Spring бина может выглядеть следующим образом:

@Component 
public class MyErrorHandler { 

    /** 
    * Actual error handler invoked as service 
    */ 
    public void checkError(DelegateExecution execution) { 

    execution.getVariables(); // Map<String, Object> of variables 

    execution.setVariable("errorCode", 500); // update variable 
    } 
} 
+0

Итак, «исполнение» - это переменная по умолчанию, которая всегда присутствует в ProcessVariables? – Jonathan

+0

Только что проверено: Да, это так. Большое спасибо! – Jonathan

+0

Да, он доступен по умолчанию. Я обновил свой ответ, чтобы отразить это. – nre