Переменные процесса в Camunda-BPM
У меня есть простой процесс bpmn Sample.bpmn, в котором я использую 2 служебные задачи, я выполняю свой процесс с помощью processEngine.getRuntimeService(). StartProcessInstanceByKey("Process_1", variable); где мои переменные выглядит следующим образом:
Map variables = new HashMap();
variables.put("a", 2);
variables.put("b", 5);
Моя первая сервисная задача - реализация Java-класса Addition, а вторая сервисная задача - реализация класса умножения.
Теперь я хочу иметь 3 переменные (константы) "c", "d" и "e", чтобы c=5,d=10,e=2, чтобы я мог использовать свою переменную "c" для служебной задачи 1. таким образом, что в дополнительном классе я могу использовать эту переменную, аналогично я хочу использовать переменную "d" в моем классе умножения и переменную "e", которую я хочу определить глобально, чтобы я мог использовать это в обоих классах.
Кто-нибудь может направить меня в этом?
2 ответа
В качестве быстрого исправления вы можете включить в качестве первой задачи процесса задачу настройки службы, которая предварительно заполняет переменные процесса. В зависимости от того, как вы запускаете процесс, вы можете: Установить переменные через java-object-api
https://docs.camunda.org/manual/7.5/user-guide/process-engine/variables/
или вы, если используете вызов REST, можете указать следующие фиксированные значения в теле запроса:
https://docs.camunda.org/manual/7.5/reference/rest/process-definition/post-start-process-instance/
Другим простым решением будет класс со статическими значениями или перечисление, содержащее необходимые значения.
--редактировать--
если вы хотите использовать расширение inputOutput, добавьте что-то подобное в ваш файл bpmn:
<bpmn:process id="Process_1" isExecutable="false">
<bpmn:extensionElements>
<camunda:inputOutput>
<camunda:inputParameter name="c">5</camunda:inputParameter>
<camunda:inputParameter name="d">10</camunda:inputParameter>
<camunda:inputParameter name="e">2</camunda:inputParameter>
</camunda:inputOutput>
</bpmn:extensionElements>
это не может быть сделано в представлении схемы моделера camunda, просто переключитесь на XML-представление процесса и добавьте extensionElement.
Документация показывает два разных способа хранения значения:
Java-объект api Типизированное значение api
Я думаю, использование Java-объекта API требует Java-объекта для реализации сериализуемого интерфейса? Следующий код сломается, если объект Order не реализует интерфейс Serializable
com.example.Order order = new com.example.Order();
runtimeService.setVariable(execution.getId(), "order", order);
com.example.Order retrievedOrder = (com.example.Order) runtimeService.getVariable(execution.getId(), "order");
==
Я хотел бы использовать следующий формат для объекта Java
ObjectValue customerDataValue = Variables.objectValue(customerData)
.serializationDataFormat(Variables.SerializationDataFormats.JAVA)
.create();
execution.setVariable("someVariable", customerDataValue);
customerdata относится к любому объекту Java. Однако, если переменные-члены содержат некоторые другие ссылки, эти ссылки также должны быть сериализуемыми. Чтобы избежать этого, вы должны будете объявить эти ссылки как временные
Более того, используйте метод setVariableLocal, если вы не хотите, чтобы данные сохранялись в БД
Чтобы создать переменную как глобальную:org.camunda.bpm.engine.variable.Variables.putValue("keyName", VariableType);
Чтобы получить глобальный варибал: VariableType value = (VariableType) delegateExecution.getVariable("getKey");
Примечание: ваш dto должен быть сериализуемым, иначе camnuda выдаст ошибку сериализации.