Hi,
Using Rules in our workflow saves us the trouble of creating Sessions and firing rules explicitly. Everything is done automatically. Sharing an example on using rules in jbpm 4 workflow.
1) Process Definition :
<?xml version="1.0" encoding="UTF-8"?>
<process key="rules" name="TestRules" xmlns="http://jbpm.org/4.3/jpdl">
<start g="133,0,48,48" name="start1">
<transition to="Rule"/>
</start>
<rules g="60,84,193,73" name="Rule">
<fact var="check"/>
<transition to="exclusive1"/>
</rules>
<decision expr="#{check.decision}" g="132,192,75,58" name="exclusive1">
<transition g="-30,-14" name="Yes" to="java1"/>
<transition g="8,-12" name="No" to="java2"/>
</decision>
<java class="action.Print" g="36,252,85,49" method="printYes" name="java1">
<transition to="end1"/>
</java>
<java class="action.Print" g="192,252,84,49" method="printNo" name="java2">
<transition to="end1"/>
</java>
<end g="132,324,55,53" name="end1"/>
</process>
Process Definition here consists of a Rule node which matches the fact "check" with the rules in .drl file. Following which the value of the class variable decision is matched and accordingly a transition is taken up by the workflow.
2) Rule Resource :
import action.Customer;
rule "CheckAge1"
when
customer : Customer( age >= 18)
then
System.out.println("INSIDE RULE CHECKAGE1");
customer.setDecision("Yes");
end
rule "CheckAge2"
when
customer : Customer( age < 18)
then
System.out.println("INSIDE RULE CHECKAGE2");
customer.setDecision("No");
end
3) POJO :
package action;
import java.io.Serializable;
public class Customer implements Serializable {
int age;
String decision="Yes";
Customer(int age)
{
this.age = age;
}
public int getAge()
{
return age;
}
public void setAge(int age)
{
this.age = age;
}
public String getDecision()
{
return decision;
}
public void setDecision(String decision)
{
this.decision = decision;
}
}
4) Main Class :
package action;
import java.util.HashMap;
import java.util.Map;
import org.jbpm.api.Configuration;
import org.jbpm.api.ExecutionService;
import org.jbpm.api.ProcessEngine;
import org.jbpm.api.RepositoryService;
public class StartRulesProcess {
public static void main(String[] args) {
Configuration configuration = new Configuration();
ProcessEngine processEngine = configuration.buildProcessEngine();
RepositoryService repositoryService = processEngine.getRepositoryService();
ExecutionService executionService = processEngine.getExecutionService();
repositoryService.createDeployment().addResourceFromClasspath("Rule.drl").addResourceFromClasspath("TestRules.jpdl.xml").deploy();
// repositoryService.createDeployment().addResourceFromClasspath("TestRules.jpdl.xml").deploy();
Map<String, Object> var = new HashMap<String, Object>();
var.put("check", new Customer(19));
executionService.startProcessInstanceByKey("rules", var);
}
}
Regards
-
Customer.java.zip 328 bytes
-
StartRulesProcess.java.zip 549 bytes
-
Rule.drl.zip 295 bytes
-
TestRules.jpdl.xml 791 bytes
Comments