[jboss-user] [JBoss jBPM] - Re: How to invoke rules(drools) from a jBPM
rinki
do-not-reply at jboss.com
Tue Nov 4 08:18:48 EST 2008
Below are the files:
1. File for invoking jbpm process
package com.sample.test;
import org.jbpm.graph.def.ProcessDefinition;
import org.jbpm.graph.exe.ProcessInstance;
public class TestDroolsInvocation {
/**
* @param args
*/
public static void main(String[] args) {
ProcessDefinition definition = ProcessDefinition.parseXmlResource("JbpmDroolsExample/processdefinition.xml");
ProcessInstance instance = new ProcessInstance(definition);
instance.signal();
//instance.signal();
System.out.println("Ended!!!");
}
}
2. File where rules are invoked(Actionhandler)
package com.sample.action;
import org.jbpm.graph.def.ActionHandler;
import org.jbpm.graph.exe.ExecutionContext;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;
import org.drools.WorkingMemory;
import org.drools.compiler.DrlParser;
import org.drools.compiler.PackageBuilder;
import org.drools.lang.descr.PackageDescr;
import org.drools.rule.Package;
import java.io.*;
public class FireRulesActionHandler implements ActionHandler {
private static final long serialVersionUID = 1L;
public static String ruleFile;
/**
* The FireRulesActionHandler gets variables from the Instance, and asserts
* them into the Rules Engine and invokes the rules.
*/
public void execute(ExecutionContext executionContext) throws Exception {
try {
//load up the rulebase
RuleBase ruleBase = readRule();
WorkingMemory workingMemory = ruleBase.newStatefulSession();
//go !
Message message = new Message();
message.setMessage( "Hello World" );
message.setStatus( Message.LikesCheese );
workingMemory.insert( message );
workingMemory.fireAllRules();
} catch (Throwable t) {
t.printStackTrace();
}
}
private static RuleBase readRule() throws Exception {
//read in the source
Reader source = new InputStreamReader( FireRulesActionHandler.class.getResourceAsStream("E:/jBPM/workspace/InvokingDrools/src/main/java/com/sample/rules/CheeseRules.drl"));
//Reader source = new InputStreamReader(FireRulesActionHandler.class.getResourceAsStream(ruleFile));
DrlParser parser = new DrlParser();
PackageDescr packageDescr = parser.parse(source);
// pre build the package
PackageBuilder builder = new PackageBuilder();
builder.addPackage(packageDescr);
Package pkg = builder.getPackage();
/*PackageBuilder builder = new PackageBuilder();
builder.addPackageFromDrl( source );
Package pkg = builder.getPackage();*/
//add the package to a rulebase (deploy the rule package).
RuleBase ruleBase = RuleBaseFactory.newRuleBase();
ruleBase.addPackage( pkg );
return ruleBase;
}
public static class Message {
public static final int LikesCheese = 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;
}
}
}
3. CheeseRules.drl
#created on: Nov 4, 2008
package src.main.rules
import com.sample.action.FireRulesActionHandler.Message;
rule "Bob Likes Cheese"
when
m : Message( status == Message.LikesCheese, message : message )
then
System.out.println( message );
m.setMessage( "Bob enjoys eating cheese" );
m.setStatus( Message.GOODBYE );
update( m );
end
rule "GoodBye"
when
Message( status == Message.GOODBYE, message : message )
then
System.out.println( message );
end
Everything is present in jbpm project.
Regards,
Ruchika
View the original post : http://www.jboss.com/index.html?module=bb&op=viewtopic&p=4186681#4186681
Reply to the post : http://www.jboss.com/index.html?module=bb&op=posting&mode=reply&p=4186681
More information about the jboss-user
mailing list