#alfresco #activiti #bpmn
#на свежем воздухе #activiti #bpmn
Вопрос:
Я вызываю вспомогательный процесс из основного процесса. Я использую процесс Alfresco Activiti 7.1.0.M3.1. Sub запускается без проблем, но когда я пытаюсь получить переменные в нем с execution.getVariables()
помощью or execution.getVariable("par1")
, я ничего не получаю. (пустая карта или null) Именно так я устанавливаю переменную в основном процессе:
<callActivity id="callactivity1" name="Call activity" calledElement="myProcess2" >
<extensionElements>
<activiti:in source="var1i" target="par1"></activiti:in>
<activiti:out source="par1" target="var1i"></activiti:out>
<activiti:executionListener event="start" delegateExpression="${executionListener}"></activiti:executionListener>
<activiti:executionListener event="end" delegateExpression="${executionListener}"></activiti:executionListener>
</extensionElements>
</callActivity>
Я нашел флаг в CallActivity: callActivity.isInheritVariables()
с этим флагом true (его нельзя установить из Eclipse, только из java), затем переменные передаются в вспомогательный процесс, но с теми же именами, что и в основном процессе (var1i). И когда я изменяю эту переменную в подпроцессе, она не возвращается в main.
Я внимательно прочитал документы: https://www.activiti.org/userguide/#bpmnCallActivity и делает в точности так, как в нем написано. Похоже, это не сработало.
Я вижу способ написать собственную реализацию CallActivityBehavior и установить ее в engine, и она будет работать, но в документах она должна работать из конфигурации по умолчанию. Чего мне не хватает?
Ответ №1:
Сначала вы попытались связаться с экземпляром корневого процесса с помощью;
ExecutionEntity thisEntity = (ExecutionEntity) execution;
ExecutionEntity pi= (ExecutionEntityImpl) thisEntity.getRootProcessInstance()
Пожалуйста, взгляните на эту ссылку ниже,
Комментарии:
1. ДА. Контекст — это один из способов получения переменных. Другой способ — переопределить CallActivityBehavior и установить его в engine . Например:
engineConfiguration.setActivityBehaviorFactory(new CustomActivityBehaviorFactory());
но что мне нужно, так это правильно передавать переменные, как написано в документации. С изменением имен переменных. Пользовательская реализация выглядит странно, если движок должен работать по конфигурации по умолчанию. Я видел форумы, где у людей были проблемы с несколькими экземплярами, вызывающими CallActivity. Они написали, что default работает правильно, а multi instance — нет. Я все еще скучаю2. Вместо этого я предлагаю вам собрать переменные в список или массив и таким образом передать их в подпроцесс. Вы можете собрать переменные в ExecutionListener, вызвав execution.getVariables() , это вернет сопоставление переменных в процессе выполнения, затем вы можете присвоить этот список локальной (в пределах задачи) переменной, которую вы задаете в качестве входных данных для вызываемого действия. Таким образом, локальная переменная задачи исчезает, как только вы возвращаетесь из вызываемого действия, и вы не передаете в вызываемое действие больше, чем вам нужно.