Снижает слюни, отображая картирование, не удалось - что я делаю не так?
-
19-09-2019 - |
Вопрос
Я создал два процесса «Hello World», чтобы дать подпроцессовым узлам вихрь. У меня проблемы с получением вывода из подпроцесса обратно в основной процесс. Я надеюсь, что кто -то сможет просветить меня на то, что я делаю неправильно, так как я не могу найти никаких документаций или примеров, которые проливают свет на то, почему мой не работает.
В моем основном процессе у меня есть следующее (обратите внимание, что я обрезал заголовки, нижние колонтитулы и позиционные x, y, высота, атрибуты ширины):
... 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...
Это как то, как я интерпретировал документ и примеры. Необходимые переменные объявляются как в основном процессе, так и на подпроцессе, а затем просто используйте элементы отображения подпроцесса в/out для установки атрибутов от и для атрибутов.
Проблема в том ... пока name
был передан в подпроцесс без проблем, пытаясь получить length
Вернуться к основному процессу не удалось. А length
В подпроцессе был успешно изменен. Но на выходе, length
В основном процессе не изменился.
Что я делаю не так? Указатели и объяснения высоко ценятся. Спасибо.
Решение
Проблема в том, что ваше действие не изменяет переменную длины. Это просто изменяет локальную переменную длину внутри вашего действия. Чтобы изменить значение переменной, используйте kcontext.setVariable ("length", name.length ());
Вы также должны обновить до последнего релиза Drools 5.1 M1, так как это включает в себя решение для проблемы с отображениями на случай, если подпроцесс полностью синхронно (как в вашем примере).
Крис Верлаенен