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...
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/t...
Kris
Quoting Kevin Alonso <kalonso(a)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(a)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(a)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