Ошибка отображения подпроцесса Drools — что я делаю неправильно?

Я создал два процесса «Hello World», чтобы дать узлам подпроцесса вихрь. У меня возникли проблемы с возвратом вывода из подпроцесса в основной процесс. Я надеюсь, что кто-то может просветить меня о том, что я делаю неправильно, поскольку я не могу найти никакой документации или примеров, которые проливают свет на то, почему мой не работает.

В моем основном процессе у меня есть следующее (обратите внимание, что я вырезал заголовки, нижние колонтитулы и позиционные атрибуты x, y, height, width):

 ... snip...

 <header>
   <variables>
     <variable name="name" >
      <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
       <value>World</value>
     </variable>
     <variable name="length" >
       <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" />
       <value>0</value>
     </variable>
   </variables>
 </header>

 ... snip...

 <subProcess id="4" name="SubHello"
             processId="subhello" waitForCompletion="true" >
 <mapping type="in" from="name" to="name" />
 <mapping type="out" from="length" to="length" />
</subProcess>

 ... snip...

А вот простой подпроцесс subhello, который просто берет ввод и выводит его, а затем получает длину ввода, чтобы вернуть его обратно:

 ... snip...

 <header>
   <variables>
     <variable name="name" >
      <type name="org.drools.process.core.datatype.impl.type.StringDataType" />
       <value></value>
     </variable>
     <variable name="length" >
       <type name="org.drools.process.core.datatype.impl.type.IntegerDataType" />
       <value></value>
     </variable>
   </variables>
 </header>

 <nodes>
   <start id="1" name="Start" />
   <end id="2" name="End" />
   <actionNode id="3" name="Action" >
       <action type="expression" dialect="mvel" >
System.out.println(name + ", " + length + ", in SubProcess, before");
length = name.length;
System.out.println(length + ", in SubProcess, after");
       </action>
   </actionNode>
 </nodes>

 ... snip...

Это соответствует тому, как я интерпретировал документ и примеры. Необходимые переменные объявляются как в основном процессе, так и в подпроцессе, а затем просто используйте элементы сопоставления входа/выхода подпроцесса, чтобы установить атрибуты from и to.

Проблема в том, что... в то время как name был без проблем передан подпроцессу, попытка вернуть length обратно в основной процесс не удалась. length в подпроцессе успешно изменен. Но при выходе length в основном процессе не изменился.

Что я делаю неправильно? Указатели и объяснения очень ценятся. Спасибо.


person aberrant80    schedule 02.10.2009    source источник


Ответы (1)


Проблема в том, что ваше действие не изменяет переменную длины. Он просто изменяет длину локальной переменной внутри вашего действия. Чтобы изменить значение переменной, используйте kcontext.setVariable("length", name.length());

Вам также следует обновиться до последней версии Drools 5.1 M1, так как она включает исправление проблемы с отображением, если подпроцесс полностью синхронен (как в вашем примере).

Крис Верлаенен

person Kris Verlaenen    schedule 03.10.2009
comment
Спасибо за исправление. Я просто хотел бы отметить, что документы должны быть более четкими, поскольку мне действительно нужно вызывать context.setVariable() в узле Action, чтобы установить значение переменной процесса. В документе Action node не упоминается, что выполнение в нем length = name.length просто устанавливает локальную переменную. Из документа SubFlow я просто предположил, что настройки length = length будет достаточно. Но еще раз спасибо! Далее я изучаю обработку событий. - person aberrant80; 05.10.2009