Looks like the rule was not working properly because the Message class was an inner class.   Thanks if you tried to look at this.  

 

From: rules-users-bounces@lists.jboss.org [mailto:rules-users-bounces@lists.jboss.org] On Behalf Of Todd Pagni
Sent: Monday, December 21, 2009 10:49 AM
To: Rules Users List
Subject: [rules-users] Problem calling rules from a flow

 

For some reason I cannot get the most basic rule to fire from a flow.  Not sure what is going on, but would appreciate some help.  This is in Drools 5.1.0.M1. 

 

I pretty much followed the example at http://www.developer.com/java/ent/article.php/10933_3821101_4/Rev-Up-the-Drools-5-Java-Rule-Engine.htm, but it did not work for me.    I don’t get an error message and I don’t see the rule fire and print the system.out.

 

 

.rf

<?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="flow" id="com.sample.bpmn.hello" package-name="com.sample">

 

  <header>

  </header>

 

  <nodes>

    <end id="4" name="End" x="561" y="140" width="48" height="48" />

    <start id="1" name="Start" x="66" y="88" width="48" height="48" />

    <ruleSet id="3" name="Rule" x="368" y="159" width="80" height="48" ruleFlowGroup="helloGroup" />

  </nodes>

 

  <connections>

    <connection from="3" to="4" />

    <connection from="1" to="3" />

  </connections>

 

</process>

 

.dlr

package com.sample

 

import com.sample.DroolsTest.Message;

 

rule "Hello World Message"

ruleflow-group "helloGroup"

      when

            m : Message( status == Message.HELLO, myMessage : message )

      then

            System.out.println( myMessage + "***" );

            m.setMessage( "Goodbye cruel world Message" );

            m.setStatus( Message.GOODBYE );

            update( m );

end

 

 

 

Java

package com.sample;

 

import org.drools.KnowledgeBase;

import org.drools.KnowledgeBaseFactory;

import org.drools.bpmn2.xml.BPMNSemanticModule;

import org.drools.builder.KnowledgeBuilder;

import org.drools.builder.KnowledgeBuilderConfiguration;

import org.drools.builder.KnowledgeBuilderError;

import org.drools.builder.KnowledgeBuilderErrors;

import org.drools.builder.KnowledgeBuilderFactory;

import org.drools.builder.ResourceType;

import org.drools.compiler.PackageBuilderConfiguration;

import org.drools.io.ResourceFactory;

import org.drools.logger.KnowledgeRuntimeLogger;

import org.drools.logger.KnowledgeRuntimeLoggerFactory;

import org.drools.runtime.StatefulKnowledgeSession;

 

/**

 * This is a sample class to launch a rule.

 */

public class DroolsTestFlowAndRule {

 

                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'

                                               

                                                Message message = new Message();

                                                message.setMessage("Hello World Message");

                                                message.setStatus(Message.HELLO);

                                                ksession.insert(message);

                                               

                                                ksession.startProcess("com.sample.bpmn.hello");

                                                ksession.fireAllRules();

                                                logger.close();

                                               

                                } catch (Throwable t) {

                                                t.printStackTrace();

                                }

                }

 

                private static KnowledgeBase readKnowledgeBase() throws Exception {

                                               

                                KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();

                                kbuilder.add(ResourceFactory.newClassPathResource("hello.rf"), ResourceType.DRF);

                                kbuilder.add(ResourceFactory.newClassPathResource("Sample.drl"), ResourceType.DRL);

                               

                                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;

                }

 

                public static class Message {

                               

                                public static final int HELLO = 0;

                                public static final int GOODBYE = 1;

 

                                private String message;

 

                                private int status;

 

                                public String getMessage() {

                                                return this.message;

                                }

 

                                public void setMessage(String message) {

                                                this.message = message;

                                }

 

                                public int getStatus() {

                                                return this.status;

                                }

 

                                public void setStatus(int status) {

                                                this.status = status;

                                }

                               

                }

 

}