Falha no mapeamento do Drools SubProcess - o que estou fazendo de errado?
-
19-09-2019 - |
Pergunta
Criei dois processos "Hello World" para dar uma chance aos nós do subProcess.Estou tendo problemas para obter a saída do subProcess de volta ao processo principal.Espero que alguém possa me esclarecer sobre o que estou fazendo de errado, pois não consigo encontrar nenhuma documentação ou exemplos que esclareçam por que o meu não funciona.
No meu processo principal, tenho o seguinte (observe que recortei cabeçalhos, rodapés e os atributos posicionais x, y, altura e largura):
... 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...
E aqui está o simples subhello
SubProcess, que simplesmente pega a entrada e a imprime, e então obtém o comprimento da entrada para retorná-la:
... 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...
Foi assim que interpretei o documento e os exemplos.As variáveis necessárias são declaradas no processo principal e no subprocesso e, em seguida, basta usar os elementos de mapeamento de entrada/saída do subProcess para definir os atributos from e to.
O problema é....enquanto name
foi passado para o subprocesso sem problemas, tentando obter length
voltar ao processo principal falhou.O length
no subprocesso foi modificado com sucesso.Mas na saída, length
no processo principal não mudou.
O que estou fazendo de errado?Dicas e explicações são muito apreciadas.Obrigado.
Solução
O problema é que sua ação não altera a variável length.Apenas altera o comprimento da variável local dentro da sua ação.Para alterar o valor da variável, use kcontext.setVariable("length", name.length());
Você também deve atualizar para a versão mais recente do Drools 5.1 M1, pois isso inclui uma correção para um problema sem mapeamentos caso o subprocesso seja completamente síncrono (como é o caso do seu exemplo).
Kris Verlaenen