[rules-users] Drools fusion how to I catch an Exception

RichardAmbridge richard.ambridge at gmail.com
Wed Sep 5 09:14:44 EDT 2012


If I have a rule that has an error in it, the error isn't being caught by the
compiler and the error doesn't happen as the Object is inserted into the
session, it only happens after a time period completes, then Drools silently
fails.
How can I catch these silent failures.

See below for test case.

Notice in the After5 rule there is a mistake in the then part.
m.status=$m.status;

$m doesn't exist.

If i change this to $m.status=m.status, the compiler detects the error, but
this way of m.status=$m.status is not found.

When the rule fires it just dies.  
I need to be able to catch the Exception somehow and report it..

Any help really appreciated..
Thanks
Ric


----------
sample.drl:-
----------

package com.sample
 
import com.sample.DroolsTest.Message;
 
declare Message
 @role ( event )
end
rule "Hello"
 dialect "mvel"

	when
		m : Message( status == Message.HELLO, myMessage : message )		
		
	then
		System.out.println( "Hello added" );		
end

rule "After5"
 dialect "mvel"

	when
		m : Message( status == Message.HELLO, myMessage : message )
		not( Message( status == Message.GOODBYE , this after [0s,5s] m ))
		
	then
		System.out.println( "After5 then start" );
		m.status=$m.status;
		System.out.println( "After5 then stop" );
		retract(m);
end

----------
DroolsTest.java:
----------
package com.sample;

import org.drools.KnowledgeBase;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest {

	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");
			// go !
			Message message = new Message();
			message.setMessage("Hello World");
			message.setStatus(Message.HELLO);
			System.out.println("Inserting message");
			ksession.insert(message);
			System.out.println("Fire all rules");
			ksession.fireAllRules();
			System.out.println("Sleep 10");
			Thread.sleep(10000);
			System.out.println("End sleep");
			logger.close();
		} catch (Throwable t) {
			t.printStackTrace();
		}
	}

	private static KnowledgeBase readKnowledgeBase() throws Exception {
		KnowledgeBaseConfiguration conf = KnowledgeBaseFactory
				.newKnowledgeBaseConfiguration();
		conf.setOption(EventProcessingOption.STREAM); // STREAM mode as we are
														// dealing with Events	

		KnowledgeBuilder kbuilder = KnowledgeBuilderFactory
				.newKnowledgeBuilder();
		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(conf);
		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;
		}

	}

}



--
View this message in context: http://drools.46999.n3.nabble.com/Drools-fusion-how-to-I-catch-an-Exception-tp4019597.html
Sent from the Drools: User forum mailing list archive at Nabble.com.


More information about the rules-users mailing list