[rules-users] Event Wait Nodo in a ruleflow

Kris Verlaenen kris.verlaenen at cs.kuleuven.be
Fri Sep 25 09:12:26 EDT 2009


There indeed seems to be an issue here.  Basically, once you insert the
person object, the engine will start processing constraints.  It will
notice your Person() constraint of your wait node has become true now,
and will continue the execution of the process.  In this case however,
it has not yet finished evaluating all constraints apparently. 
Therefore, it will still think the not Person() constraint is still
valid as it hasn't re-processes it yet.  We will need to add a wait in
the implementation until all activations have been updated.

That said, it appears you actually want to use the (Wait) State node
that has been added recently (which basically deprecates the Event Wait
node as allows you to do what the Event Wait node can do but is more
powerful).  This allows you to wait in this state node and attach
constraints to the outgoing connections.  Some example junit tests can
be found here:
http://anonsvn.jboss.org/repos/labs/labs/jbossrules/trunk/drools-compiler/src/test/java/org/drools/integrationtests/ProcessStateTest.java
Still working on adding the documentation for that ...

So you could give that a try if you download the latest release:
https://hudson.jboss.org/hudson/job/drools/lastSuccessfulBuild/artifact/trunk/target/

Kris

Quoting Kevin Alonso <kalonso at vicomtech.org>:

> 
> 
> 
>   
> 
> 
> Hi Kris,
> 
> 
> 
> I hope you can help me.
> 
> 
> 
> Here you have the whole code:
> 
> 
> 
> public class RuleFlowTest {
> 
> 
> 
>     public static final void main(String[] args) {
> 
>         try {
> 
>             // load up the knowledge base
> 
>             KnowledgeBase kbase = readKnowledgeBase();
> 
>             StatefulKnowledgeSession ksession =
> kbase.newStatefulKnowledgeSession();
> 
>             KnowledgeRuntimeLogger logger =
> KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");
> 
>             // start a new process instance
> 
>             ksession.startProcess("com.sample.ruleflow");
> 
>             System.out.println("Waiting...");
> 
>             Person person = new Person();
> 
>             person.setName("Kevin");
> 
>             person.setSurname("Alonso");
> 
>             ksession.insert(person);
> 
>             logger.close();
> 
>         } catch (Throwable t) {
> 
>             t.printStackTrace();
> 
>         }
> 
>     }
> 
> 
> 
>     private static KnowledgeBase readKnowledgeBase() throws Exception
> {
> 
>         KnowledgeBuilder kbuilder =
> KnowledgeBuilderFactory.newKnowledgeBuilder();
> 
>        
> kbuilder.add(ResourceFactory.newClassPathResource("ruleflow.rf"),
> ResourceType.DRF);
> 
>         KnowledgeBuilderErrors errors = kbuilder.getErrors();
> 
>         if (errors.size() > 0) {
> 
>             for (KnowledgeBuilderError error: errors) {
> 
>                 System.err.println(error);
> 
>             }
> 
>             throw new IllegalArgumentException("Could not parse
> knowledge.");
> 
>         }
> 
>         KnowledgeBase kbase =
> KnowledgeBaseFactory.newKnowledgeBase();
> 
>         kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
> 
>         return kbase;
> 
>     }
> 
> 
> 
> }
> 
> 
> 
> Person Class:
> 
> 
> 
> public class Person {
> 
>     String name;
> 
>     String surname;
> 
>     public String getName() {
> 
>         return name;
> 
>     }
> 
>     public void setName(String name) {
> 
>         this.name = name;
> 
>     }
> 
>     public String getSurname() {
> 
>         return surname;
> 
>     }
> 
>     public void setSurname(String surname) {
> 
>         this.surname = surname;
> 
>     }
> 
> 
> 
> }
> 
> 
> 
> 
> 
> And rf file.
> 
> 
> 
> <?xml version="1.0" encoding="UTF-8"?> 
> 
> <process xmlns="http://drools.org/drools-5.0/process"
> 
>          xmlns:xs="http://www.w3.org/2001/XMLSchema-instance"
> 
>          xs:schemaLocation="http://drools.org/drools-5.0/process
> drools-processes-5.0.xsd"
> 
>          type="RuleFlow" name="ruleflow" id="com.sample.ruleflow"
> package-name="com.sample" >
> 
> 
> 
>   <header>
> 
>     <imports>
> 
>       <import name="com.sample.Person" />
> 
>     </imports>
> 
>   </header>
> 
> 
> 
>   <nodes>
> 
>     <start id="1" name="Start" x="16" y="16" />
> 
>     <end id="3" name="End" x="480" y="277" width="80" height="40"
> />
> 
>     <milestone id="4" name="Event Wait" x="130" y="17" width="80"
> height="40" >
> 
>       <constraint type="rule" dialect="mvel"
> >Person()</constraint>
> 
>     </milestone>
> 
>     <end id="5" name="End" x="312" y="275" width="80" height="40"
> />
> 
>     <split id="6" name="Split" x="354" y="18" width="80" height="40"
> type="2" >
> 
>       <constraints>
> 
>         <constraint toNodeId="8" toType="DROOLS_DEFAULT" name="Not
> Person" priority="1" type="rule" dialect="mvel" >not
> Person()</constraint>
> 
>         <constraint toNodeId="7" toType="DROOLS_DEFAULT"
> name="Person" priority="1" type="rule" dialect="mvel"
> >Person()</constraint>
> 
>       </constraints>
> 
>     </split>
> 
>     <actionNode id="7" name="Action" x="482" y="185" width="80"
> height="40" >
> 
>         <action type="expression" dialect="java"
> >System.out.println("Person");</action>
> 
>     </actionNode>
> 
>     <actionNode id="8" name="Action" x="310" y="185" width="80"
> height="40" >
> 
>         <action type="expression" dialect="mvel"
> >System.out.println("No Person");</action>
> 
>     </actionNode>
> 
>   </nodes>
> 
> 
> 
>   <connections>
> 
>     <connection from="7" to="3" />
> 
>     <connection from="1" to="4" />
> 
>     <connection from="8" to="5" />
> 
>     <connection from="4" to="6" />
> 
>     <connection from="6" to="7" />
> 
>     <connection from="6" to="8" />
> 
>   </connections>
> 
> 
> 
> </process>
> 
> 
> 
> 
> 
> 
> 
> 
> 
> Kevin.
> 
> 
> 
> Kris Verlaenen escribió:
> 
>   Kevin,
> 
> Could you also post your process, so I can take a look and if
> necessary
> try it out locally to see what is going on?
> 
> Kris
> 
> Quoting Kevin Alonso <kalonso at vicomtech.org>:
> 
>   
>   
>     Hello,
> I´m working with a simple flow that has a  Event Wait node. This
> node
> 
> has the following condition:
> - Person()
> 
> Being Person a class that is not inserted into the session yet.
> 
> When the flow arrives to the event wait node its execution stops and
> the 
> test main class execution continues. Here I insert a Person object
> to
> 
> the session, so now, the flow can continue. After wait node I have a
> 
> Split node, which has the followings constraints:
> 
> - Person()
> 
> - not Person()
> 
> The flow always take the not Person() way. But now a Person instance
> is 
> into the session.
> 
> Why is happening this?
> 
> Could anyone help me?
> 
> Thank you,
> Kevin
> _______________________________________________
> rules-users mailing list
> rules-users at lists.jboss.org
> https://lists.jboss.org/mailman/listinfo/rules-users
> 
>     
>   
>   
> 
> 
> 
> Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm
> 
>   
> 
> 
> 
> 




Disclaimer: http://www.kuleuven.be/cwis/email_disclaimer.htm



More information about the rules-users mailing list