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"/>


   <rules g="60,84,193,73" name="Rule">

   <fact var="check"/>

      <transition to="exclusive1"/>


   <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"/>


   <java class="action.Print" g="36,252,85,49" method="printYes" name="java1">

      <transition to="end1"/>


   <java class="action.Print" g="192,252,84,49" method="printNo" name="java2">

      <transition to="end1"/>


   <end g="132,324,55,53" name="end1"/>



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"


    customer : Customer( age >= 18)


      System.out.println("INSIDE RULE CHECKAGE1");




rule "CheckAge2"


    customer : Customer( age < 18)


      System.out.println("INSIDE RULE CHECKAGE2");





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("TestRules.jpdl.xml").deploy();


        Map<String, Object> var = new HashMap<String, Object>();

        var.put("check", new Customer(19));


        executionService.startProcessInstanceByKey("rules", var);