Search in sources :

Example 1 with DefaultAgendaEventListener

use of org.kie.api.event.rule.DefaultAgendaEventListener in project drools by kiegroup.

the class WorkingMemoryActionsSerializationTest method before.

@Before
public void before() {
    ruleCalls.clear();
    KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()), ResourceType.DRL);
    if (kbuilder.hasErrors()) {
        fail(kbuilder.getErrors().toString());
    }
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());
    ksession = kbase.newKieSession();
    ksession.addEventListener(new DefaultAgendaEventListener() {

        @Override
        public void afterMatchFired(final AfterMatchFiredEvent event) {
            final String name = event.getMatch().getRule().getName();
            System.out.println(name + " fired!");
            synchronized (ruleCalls) {
                Integer calls = ruleCalls.get(name);
                if (calls == null) {
                    calls = 1;
                } else {
                    calls++;
                }
                ruleCalls.put(name, calls);
            }
        }
    });
    // Using fire until halt. If firaAllRules is called it works. But for other reasons, I need to run fireUntilHalt
    new Thread(new Runnable() {

        @Override
        public void run() {
            ksession.fireUntilHalt();
        }
    }).start();
}
Also used : KnowledgeBuilder(org.kie.internal.builder.KnowledgeBuilder) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) InternalKnowledgeBase(org.drools.core.impl.InternalKnowledgeBase) AfterMatchFiredEvent(org.kie.api.event.rule.AfterMatchFiredEvent) Before(org.junit.Before)

Example 2 with DefaultAgendaEventListener

use of org.kie.api.event.rule.DefaultAgendaEventListener in project drools by kiegroup.

the class TimerAndCalendarTest method testRaceConditionWithTimedRuleExectionOption.

@Test(timeout = 10000)
@Ignore("the listener callback holds some locks so blocking in it is not safe")
public void testRaceConditionWithTimedRuleExectionOption() throws Exception {
    // BZ-1073880
    String str = "package org.simple \n" + "global java.util.List list \n" + "rule xxx @Propagation(EAGER)\n" + "  timer (int:30s 10s) " + "when \n" + "  $s: String()\n" + "then \n" + "  list.add($s); \n" + "end  \n";
    KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
    conf.setOption(ClockTypeOption.get("pseudo"));
    conf.setOption(TimedRuleExecutionOption.YES);
    KieBase kbase = loadKnowledgeBaseFromString(str);
    KieSession ksession = createKnowledgeSession(kbase, conf);
    final CyclicBarrier barrier = new CyclicBarrier(2);
    final AtomicBoolean aBool = new AtomicBoolean(true);
    AgendaEventListener agendaEventListener = new DefaultAgendaEventListener() {

        public void afterMatchFired(org.kie.api.event.rule.AfterMatchFiredEvent event) {
            try {
                if (aBool.get()) {
                    barrier.await();
                    aBool.set(false);
                }
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }
    };
    ksession.addEventListener(agendaEventListener);
    List list = new ArrayList();
    ksession.setGlobal("list", list);
    // Using the Pseudo Clock.
    SessionClock clock = ksession.getSessionClock();
    SessionPseudoClock pseudoClock = (SessionPseudoClock) clock;
    // Insert the event.
    String eventOne = "one";
    ksession.insert(eventOne);
    // Advance the time .... so the timer will fire.
    pseudoClock.advanceTime(10000, TimeUnit.MILLISECONDS);
    // Rule doesn't fire in PHREAK. This is because you need to call 'fireAllRules' after you've inserted the fact, otherwise the timer
    // job is not created.
    ksession.fireAllRules();
    // Rule still doesn't fire, because the DefaultTimerJob is created now, and now we need to advance the timer again.
    pseudoClock.advanceTime(30000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    aBool.set(true);
    pseudoClock.advanceTime(10000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    aBool.set(true);
    String eventTwo = "two";
    ksession.insert(eventTwo);
    ksession.fireAllRules();
    // 60
    pseudoClock.advanceTime(10000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    aBool.set(true);
    // 70
    pseudoClock.advanceTime(10000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    aBool.set(true);
    // From here, the second rule should fire.
    // phaser.register();
    pseudoClock.advanceTime(10000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    aBool.set(true);
    // Now 2 rules have fired, and those will now fire every 10 seconds.
    pseudoClock.advanceTime(20000, TimeUnit.MILLISECONDS);
    barrier.await();
    barrier.reset();
    pseudoClock.advanceTime(20000, TimeUnit.MILLISECONDS);
    aBool.set(true);
    barrier.await();
    barrier.reset();
    pseudoClock.advanceTime(20000, TimeUnit.MILLISECONDS);
    aBool.set(true);
    barrier.await();
    barrier.reset();
    ksession.destroy();
}
Also used : SessionPseudoClock(org.kie.api.time.SessionPseudoClock) ArrayList(java.util.ArrayList) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) SessionClock(org.kie.api.time.SessionClock) CyclicBarrier(java.util.concurrent.CyclicBarrier) AtomicBoolean(java.util.concurrent.atomic.AtomicBoolean) KieBase(org.kie.api.KieBase) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) AgendaEventListener(org.kie.api.event.rule.AgendaEventListener) KieSession(org.kie.api.runtime.KieSession) ArrayList(java.util.ArrayList) Arrays.asList(java.util.Arrays.asList) List(java.util.List) KieSessionConfiguration(org.kie.api.runtime.KieSessionConfiguration) Ignore(org.junit.Ignore) Test(org.junit.Test)

Example 3 with DefaultAgendaEventListener

use of org.kie.api.event.rule.DefaultAgendaEventListener in project drools by kiegroup.

the class Misc2Test method testLockOnActive1.

@Test
public void testLockOnActive1() {
    // the modify changes the hashcode of TradeHeader
    // this forces the 'from' to think it's new. This results in an insert and a delete propagation from the 'from'
    // With Property Reactivity enabled by default this also required adding a @watch(*) annotation
    String drl = "" + "package org.drools.test; \n" + "import org.drools.compiler.integrationtests.Misc2Test.TradeBooking;\n" + "import org.drools.compiler.integrationtests.Misc2Test.TradeHeader;\n" + "rule \"Rule1\" \n" + "salience 1 \n" + "when\n" + "  $booking: TradeBooking() @watch(*) \n" + "  $trade: TradeHeader() from $booking.getTrade()\n" + "  not String()\n" + "then\n" + "  $trade.setAction(\"New\");\n" + "  modify($booking) {}\n" + "  insert (\"run\");\n" + "end;\n" + "\n" + "rule \"Rule2\"\n" + "lock-on-active true\n" + "when\n" + "  $booking: TradeBooking( ) @watch(*) \n" + "  $trade: Object( ) from $booking.getTrade()\n" + "then\n" + "end";
    KieBase kb = loadKnowledgeBaseFromString(drl);
    KieSession ks = kb.newKieSession();
    ReteDumper.dumpRete(kb);
    final List created = new ArrayList();
    final List cancelled = new ArrayList();
    final List fired = new ArrayList();
    ks.addEventListener(new DefaultAgendaEventListener() {

        public void matchCreated(MatchCreatedEvent event) {
            created.add(event.getMatch().getRule().getName());
        }

        public void matchCancelled(MatchCancelledEvent event) {
            cancelled.add(event.getMatch().getRule().getName());
        }

        public void afterMatchFired(AfterMatchFiredEvent event) {
            fired.add(event.getMatch().getRule().getName());
        }
    });
    ks.fireAllRules();
    TradeBooking tb = new TradeBookingImpl(new TradeHeaderImpl());
    ks.insert(tb);
    assertEquals(1, ks.fireAllRules());
    assertEquals(3, created.size());
    assertEquals(2, cancelled.size());
    assertEquals(1, fired.size());
    assertEquals("Rule2", created.get(0));
    assertEquals("Rule1", created.get(1));
    assertEquals("Rule2", created.get(2));
    assertEquals("Rule2", cancelled.get(0));
    assertEquals("Rule2", cancelled.get(1));
    assertEquals("Rule1", fired.get(0));
}
Also used : KieBase(org.kie.api.KieBase) ArrayList(java.util.ArrayList) MatchCancelledEvent(org.kie.api.event.rule.MatchCancelledEvent) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) KieSession(org.kie.api.runtime.KieSession) StatelessKieSession(org.kie.api.runtime.StatelessKieSession) Arrays.asList(java.util.Arrays.asList) ArrayList(java.util.ArrayList) List(java.util.List) MatchCreatedEvent(org.kie.api.event.rule.MatchCreatedEvent) AfterMatchFiredEvent(org.kie.api.event.rule.AfterMatchFiredEvent) Test(org.junit.Test)

Example 4 with DefaultAgendaEventListener

use of org.kie.api.event.rule.DefaultAgendaEventListener in project drools by kiegroup.

the class ActivationIteratorTest method testFilteredEagerEvaluation.

@Test(timeout = 10000)
public void testFilteredEagerEvaluation() throws Exception {
    String str = "package org.simple \n" + "rule xxx @Propagation(EAGER) \n" + "when \n" + "  $s : String()\n" + "then \n" + "end  \n" + "rule yyy @Propagation(EAGER) \n" + "when \n" + "  $s : String()\n" + "then \n" + "end  \n";
    KieSessionConfiguration conf = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
    conf.setOption(new ForceEagerActivationOption.FILTERED(new ForceEagerActivationFilter() {

        @Override
        public boolean accept(Rule rule) {
            return rule.getName().equals("xxx");
        }
    }));
    KieBase kbase = loadKnowledgeBaseFromString(str);
    KieSession ksession = createKnowledgeSession(kbase, conf);
    final List list = new ArrayList();
    AgendaEventListener agendaEventListener = new DefaultAgendaEventListener() {

        public void matchCreated(org.kie.api.event.rule.MatchCreatedEvent event) {
            list.add("activated");
        }
    };
    ksession.addEventListener(agendaEventListener);
    ksession.insert("test");
    ((InternalWorkingMemory) ksession).flushPropagations();
    assertEquals(1, list.size());
}
Also used : ForceEagerActivationOption(org.kie.internal.runtime.conf.ForceEagerActivationOption) ArrayList(java.util.ArrayList) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) InternalWorkingMemory(org.drools.core.common.InternalWorkingMemory) ForceEagerActivationFilter(org.kie.internal.runtime.conf.ForceEagerActivationFilter) KieBase(org.kie.api.KieBase) AgendaEventListener(org.kie.api.event.rule.AgendaEventListener) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) KieSession(org.kie.api.runtime.KieSession) ArrayList(java.util.ArrayList) List(java.util.List) Rule(org.kie.api.definition.rule.Rule) KieSessionConfiguration(org.kie.api.runtime.KieSessionConfiguration) Test(org.junit.Test)

Example 5 with DefaultAgendaEventListener

use of org.kie.api.event.rule.DefaultAgendaEventListener in project drools by kiegroup.

the class ReloadSessionTest method testListenersAfterSessionReload.

@Test
@Ignore
public void testListenersAfterSessionReload() {
    // https://bugzilla.redhat.com/show_bug.cgi?id=826952
    Environment env = createEnvironment();
    KieBase kbase = initializeKnowledgeBase(simpleRule);
    StatefulKnowledgeSession ksession = JPAKnowledgeService.newStatefulKnowledgeSession(kbase, null, env);
    ksession.addEventListener(new DefaultAgendaEventListener());
    ksession.addEventListener(new DefaultRuleRuntimeEventListener());
    assertEquals(1, ksession.getRuleRuntimeEventListeners().size());
    assertEquals(1, ksession.getAgendaEventListeners().size());
    ksession = JPAKnowledgeService.loadStatefulKnowledgeSession(ksession.getIdentifier(), kbase, null, env);
    assertEquals(1, ksession.getRuleRuntimeEventListeners().size());
    assertEquals(1, ksession.getAgendaEventListeners().size());
}
Also used : KieBase(org.kie.api.KieBase) StatefulKnowledgeSession(org.kie.internal.runtime.StatefulKnowledgeSession) Environment(org.kie.api.runtime.Environment) DefaultAgendaEventListener(org.kie.api.event.rule.DefaultAgendaEventListener) DefaultRuleRuntimeEventListener(org.kie.api.event.rule.DefaultRuleRuntimeEventListener) Ignore(org.junit.Ignore) Test(org.junit.Test)

Aggregations

DefaultAgendaEventListener (org.kie.api.event.rule.DefaultAgendaEventListener)11 Test (org.junit.Test)10 KieBase (org.kie.api.KieBase)9 KieSession (org.kie.api.runtime.KieSession)9 ArrayList (java.util.ArrayList)8 List (java.util.List)7 AgendaEventListener (org.kie.api.event.rule.AgendaEventListener)5 KieSessionConfiguration (org.kie.api.runtime.KieSessionConfiguration)5 MatchCancelledEvent (org.kie.api.event.rule.MatchCancelledEvent)4 MatchCreatedEvent (org.kie.api.event.rule.MatchCreatedEvent)4 Arrays.asList (java.util.Arrays.asList)3 AfterMatchFiredEvent (org.kie.api.event.rule.AfterMatchFiredEvent)3 StatelessKieSession (org.kie.api.runtime.StatelessKieSession)3 Ignore (org.junit.Ignore)2 KieHelper (org.kie.internal.utils.KieHelper)2 CyclicBarrier (java.util.concurrent.CyclicBarrier)1 AtomicBoolean (java.util.concurrent.atomic.AtomicBoolean)1 AtomicInteger (java.util.concurrent.atomic.AtomicInteger)1 Cheese (org.drools.compiler.Cheese)1 Person (org.drools.compiler.Person)1