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.

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top