Как правильно передавать переменные через CallActivity в Activiti?

#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()
 

Пожалуйста, взгляните на эту ссылку ниже,

https://hub.alfresco.com/t5/alfresco-process-services/is-there-any-way-to-pass-transient-variable-to-inner-call/td-p/50564

Комментарии:

1. ДА. Контекст — это один из способов получения переменных. Другой способ — переопределить CallActivityBehavior и установить его в engine . Например: engineConfiguration.setActivityBehaviorFactory(new CustomActivityBehaviorFactory()); но что мне нужно, так это правильно передавать переменные, как написано в документации. С изменением имен переменных. Пользовательская реализация выглядит странно, если движок должен работать по конфигурации по умолчанию. Я видел форумы, где у людей были проблемы с несколькими экземплярами, вызывающими CallActivity. Они написали, что default работает правильно, а multi instance — нет. Я все еще скучаю

2. Вместо этого я предлагаю вам собрать переменные в список или массив и таким образом передать их в подпроцесс. Вы можете собрать переменные в ExecutionListener, вызвав execution.getVariables() , это вернет сопоставление переменных в процессе выполнения, затем вы можете присвоить этот список локальной (в пределах задачи) переменной, которую вы задаете в качестве входных данных для вызываемого действия. Таким образом, локальная переменная задачи исчезает, как только вы возвращаетесь из вызываемого действия, и вы не передаете в вызываемое действие больше, чем вам нужно.