[jboss-jira] [JBoss JIRA] (DROOLS-782) NullPointerException Updating KieContainer's KieModule Version

Mario Fusco (JIRA) issues at jboss.org
Wed May 13 09:04:20 EDT 2015


     [ https://issues.jboss.org/browse/DROOLS-782?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]

Mario Fusco resolved DROOLS-782.
--------------------------------
    Fix Version/s: 6.3.0.Beta1
       Resolution: Done


The NPE have been fixed by the propagation queue introduced with DROOLS-751. This fix https://github.com/droolsjbpm/drools/commit/fa36e123e also notifies the waiting KieSessions after an incremental compilation.

> NullPointerException Updating KieContainer's KieModule Version
> --------------------------------------------------------------
>
>                 Key: DROOLS-782
>                 URL: https://issues.jboss.org/browse/DROOLS-782
>             Project: Drools
>          Issue Type: Bug
>    Affects Versions: 6.2.0.Final
>            Reporter: Mark Kretschmann
>            Assignee: Mario Fusco
>            Priority: Critical
>             Fix For: 6.3.0.Beta1
>
>
> I'm receiving a NullPointerException trying to dynamically update the rule definitions inside a KieContainer while a KieSession is running, invoked with KieSession.fireUntilHalt().  We need to leverage KieSession.fireUntilHalt() as all of our rules in this service are timer rules, as we're leveraging drools as a scheduling service here.
> The code below shows how I'm testing this.  First I setup two rules to print every 3 and 6 seconds, then execute KieSession.fireUntilHalt().
> Then later on I update the KieContainer version with three rules which print out @ 5, 8 and 10 seconds.  I immediately receive a NullPointerException after calling the KieContainer.updateToVersion.
> Error:
> Exception in thread "Thread-14" java.lang.NullPointerException
> 	at org.drools.core.common.LeftTupleSetsImpl.addAllInserts(LeftTupleSetsImpl.java:185)
> 	at org.drools.core.common.LeftTupleSetsImpl.addAll(LeftTupleSetsImpl.java:253)
> 	at org.drools.core.phreak.RuleNetworkEvaluator.innerEval(RuleNetworkEvaluator.java:379)
> 	at org.drools.core.phreak.RuleNetworkEvaluator.outerEval(RuleNetworkEvaluator.java:161)
> 	at org.drools.core.phreak.RuleNetworkEvaluator.evaluateNetwork(RuleNetworkEvaluator.java:116)
> 	at org.drools.core.phreak.RuleExecutor.reEvaluateNetwork(RuleExecutor.java:231)
> 	at org.drools.core.phreak.RuleExecutor.evaluateNetworkAndFire(RuleExecutor.java:106)
> 	at org.drools.core.common.DefaultAgenda.fireNextItem(DefaultAgenda.java:1016)
> 	at org.drools.core.common.DefaultAgenda.fireUntilHalt(DefaultAgenda.java:1258)
> 	at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireUntilHalt(StatefulKnowledgeSessionImpl.java:1333)
> 	at org.drools.core.impl.StatefulKnowledgeSessionImpl.fireUntilHalt(StatefulKnowledgeSessionImpl.java:1310)
> 	at co.bn.sirens.engine.ScheduleRunner$1.run(ScheduleRunner.java:81)
> 	at java.lang.Thread.run(Thread.java:745)
> Code:
>    public void run()
>     {
>         String testRuleAdd = "rule \"test-rule-add\" timer (cron: */3 * * * * ?; start=\"4-MAY-2015\", end=\"30-JUN-2015\") when eval(true) then System.out.println('Hey there, I print every three seconds'); end ";
>         String testRuleAdd2 = "rule \"test-rule-add-two\" timer (cron: */6 * * * * ?; start=\"4-MAY-2015\", end=\"30-JUN-2015\") when eval(true) then System.out.println('Hey there, I print every six seconds'); end ";
>         String testRuleAdd3 = "rule \"test-rule-add-three\" timer (cron: */10 * * * * ?; start=\"4-MAY-2015\", end=\"30-JUN-2015\") when eval(true) then System.out.println('Hey there, I print every ten seconds'); end ";
>         String testRuleAdd4 = "rule \"test-rule-add-four\" timer (cron: */5 * * * * ?; start=\"4-MAY-2015\", end=\"30-JUN-2015\") when eval(true) then System.out.println('Hey there, I print every five seconds'); end ";
>         String testRuleAdd5= "rule \"test-rule-add-five\" timer (cron: */8 * * * * ?; start=\"4-MAY-2015\", end=\"30-JUN-2015\") when eval(true) then System.out.println('Hey there, I print every eight seconds'); end ";
>         try {
>             KieServices ks = KieServices.Factory.get();
>             KieFileSystem kfs = ks.newKieFileSystem();
>             EntityManager em = modelService.createEntityManager();
>             List<Schedule> schedules = em
>                     .createQuery("select s from Schedule s where s.enabled = true", Schedule.class)
>                     .getResultList();
>             schedules.forEach(s -> System.out.println(s.getPath() + " : " + s.getDefinition()));
>             schedules.forEach(s -> kfs.write(s.getPath(), s.getDefinition()));
>             ArrayList<String> testRules = new ArrayList<String>();
>             testRules.add(testRuleAdd);
>             kfs.write("src/main/resources/r1.drl", testRuleAdd);
>             kfs.write("src/main/resources/r2.drl", testRuleAdd2);
>             KieBuilder kb = ks.newKieBuilder(kfs).buildAll();
>             if (kb.getResults().hasMessages(Message.Level.ERROR)) {
>                 throw new RuntimeException(kb.getResults().toString());
>             }
>             logger.trace("repository version: " + ks.getRepository().getDefaultReleaseId());
>             ReleaseId initialReleaseId = ks.getRepository().getDefaultReleaseId();
>             KieContainer kc = ks.newKieContainer(initialReleaseId);
>             KieSession ksession = kc.newKieSession();
>             ksession.setGlobal("queueService", queueService);
>             new Thread(new Runnable() {
>                 public void run() {
>                     ksession.fireUntilHalt();
>                 }
>             }).start();
>             Thread.sleep((10000));
>             // Update release version with same KieSession
>             ReleaseId relId2 = ks.newReleaseId("os-rules", "test-release-upgrade", "1.0.1");
>             KieFileSystem kfs_2 = ks.newKieFileSystem();
>             kfs_2.generateAndWritePomXML(relId2);
>             // kfs_2.write("src/main/resources/r1.drl", testRuleAdd);
>             // kfs_2.write("src/main/resources/r2.drl", testRuleAdd2);
>             kfs_2.write("src/main/resources/r3.drl", testRuleAdd3);
>             kfs_2.write("src/main/resources/r4.drl", testRuleAdd4);
>             kfs_2.write("src/main/resources/r5.drl", testRuleAdd5);
>             KieBuilder kb2 = ks.newKieBuilder(kfs_2).buildAll();
>             if (kb2.getResults().hasMessages(org.kie.api.builder.Message.Level.ERROR)) {
>                 for (org.kie.api.builder.Message result : kb2.getResults().getMessages() ) {
>                     System.out.println(result.getText());
>                 }
>                 throw new RuntimeException((kb2.getResults().toString()));
>             }
>             KieModule km = ks.getRepository().getKieModule((relId2));
>             kc.updateToVersion(relId2);
>             
>         } catch (Exception ex) {
>             logger.error("Failed to start the schedule runner: " + ex.getMessage());
>         }
>     }



--
This message was sent by Atlassian JIRA
(v6.3.15#6346)


More information about the jboss-jira mailing list