Drools SubProcess out mapping не удалось - что я делаю не так? - PullRequest
0 голосов
/ 02 октября 2009

Я создал два процесса "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 в основном процессе не изменился.

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

1 Ответ

2 голосов
/ 03 октября 2009

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

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

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

...