Thank you, Esteban.
You are right! If I insert two events A:
rulesTest.addEventA("123");
rulesTest.addEventA("456");
The second call of fireAllRules() activates the rule for the first object:
Event inserted com.epidataconsulting.drools.model.EventA
Event A 123 at Fri Dec 07 11:54:21 ART 2012
Event inserted com.epidataconsulting.drools.model.EventA
But not for the second.
How I can do to correct this behavior?
Thanks!
Adrian
It could be the case, and I'm guessing here, that the AgendaEventListener is called just before the activation is placed into the agenda. So, the call to fireAllRules() finds an empty agenda. What you could do to check if this is what is happening, is to insert 2 EvenA objects. The second call of fireAllRules() should fire the activation of the first object (and you will miss the activation of the second).Best Regards,
On Fri, Dec 7, 2012 at 1:55 PM, Adrián Paredes <adrianp@epidataconsulting.com> wrote:
_______________________________________________Hi all:
I have a very basic doubt about Drools Fusion.
I have two simple Java classes:
EventA {
String id;
Date timestamp;
Long duration;
}
EventB {
String id;
Date timestamp;
Long duration;
}
I have a DRL file, where I declare this two classes as Events:
declare EventA
@role(event)
@timestamp(timestamp)
@duration(duration)
end
declare EventB
@role(event)
@timestamp(timestamp)
@duration(duration)
end
I have a simple rule:
rule "Basic Rule"
dialect 'mvel'
when
$eventA: EventA($aId: id) from entry-point "time stream"
then
System.out.println("Event A " + $aId + " at " + $eventA.timestamp);
end
Finally, I have a test that starts a StatefulKnowledgeSession in STREAM mode, register an eventLister in the session in order to fire the rules when an event arrives:
ksession.addEventListener(new DefaultAgendaEventListener() {
@Override
public void activationCreated(ActivationCreatedEvent event) {
((StatefulKnowledgeSession) event.getKnowledgeRuntime()).fireAllRules();
}
});
And then the test insert in the "time stream" entry-point an instance of EventA with duration of 10 miliseconds, as follows:
EventA eventA = new EventA();
eventA.setId("123");
eventA.setTimestamp(new Date());
eventA.setDuration(10L);
ksession.getWorkingMemoryEntryPoint("time stream").insert(event);
At the end of the test, I have an sleep of 2 seconds just in case.
I don't understand why the "Basic Rule" never fires.
But if I add another condition to the same rule, something like this:
rule "Basic Rule"
dialect 'mvel'
when
$eventA: EventA($aId: id) from entry-point "time stream"
not EventB($aId == id, this after [0s,5s] $eventA) from entry-point "time stream"
then
System.out.println("Event A " + $aId + " at " + $eventA.timestamp);
end
The rules fires and I see this message in console:
Event A 123 at Fri Dec 07 09:48:59 ART 2012
I don't understand why the first rule, that is more open, don't fire, and the second rule, that is more restrictive, fires without problems.
Thank you very much!
Greetings,
Adrian.
--
Epidata Consulting | Deploying Ideas
Ing. Adrián M. Paredes | Arquitecto Desarrolladoradrianp@epidataconsulting.com | Cel: (54911) 3297 1713
----------------------------------------------------------------------------------------------------------------------------Argentina: Maipú 521 Piso 1 Of. A | Buenos Aires | Of: (5411) 5031 0060Chile: Apoquindo 3600 Piso 7 y 9 | Las Condes - Santiago | Of: (+56) 2 495 8450---------------------------------------------------------------------------------------------------------------------------
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users
_______________________________________________
rules-users mailing list
rules-users@lists.jboss.org
https://lists.jboss.org/mailman/listinfo/rules-users