Drools KIE introduction

From Training Material
Jump to navigation Jump to search

Drools Kie

Drools Kie Overview

Business Rules Manager ⌘

  • allows people to manage rules in a multi user environment
  • single point of truth for business rules


  • Common terms for combining common libraries and other parts of jBPM, Drools and Fusion
  • Stands for Knowledge Is Everything

When to use Kie

  • versions/deployment of rules,
  • let non-technical people create/update/view rules
  • embedded in existing applications
  • no existing infrastructure
  • lots of "business" rules
  • can be used on its own, or with the IDE

When to not use Kie

  • mostly technical rules
  • part of an application rather than corporate solution
  • existing infrastructure and GUI

Kie Users

  • Business Analysts
  • Rule experts
  • Developers
  • Administrators
  • Managers (as documentation and analysis tool)


  • Multiple types of rule editors (GUI, text)
  • Version control (historical assets)
  • Build and deploy
  • Store multiple rule "assets" together as a package
  • Human Task console

Starting KIE

Starting KIE:

cd /opt/jbpm-server-7.XX.0.Final-dist/bin/
. standalone.sh

open a web browser and go to

localhost:8080/jbpm-console (drools 7.10)

localhost:8080/business-central (drools 7.19+)

Apply Discount

Creating a Fact Type ⌘

  • Add Asset -> Data Object
    • Data Object: ShoppingCart
  • Create new field
    • Id: totalPrice
    • Label: Total Price
    • Type: BigDecimal (not supported in test scenarios in version 7.19)
  • Save (upper right corner)

Looking at generated POJO

  • Switch to Source tab
 package npou.npproj;
 * This class was automatically generated by the data modeler tool.
 public class ShoppingCart implements java.io.Serializable {
 static final long serialVersionUID = 1L;
 @org.kie.api.definition.type.Label(value = "Total Price")
 private java.math.BigDecimal totalPrice;
 public ShoppingCart() {
 public ShoppingCart(java.math.BigDecimal totalPrice) {
 this.totalPrice = totalPrice;
 public java.math.BigDecimal getTotalPrice() {
 return this.totalPrice;

 public void setTotalPrice( java.math.BigDecimal totalPrice ) {
 this.totalPrice = totalPrice;

Drools Kie - Example

Creating a Rule

  • Add Asset -> Guided Rule
  • Resource Name: Apply Tall Order Discount
  • Enter details as below


  • View Source should return
package npou.npproj;

import java.lang.Number;

rule "Apply Tall Order Discount"
	dialect "mvel"
		$sc : ShoppingCart( $tp : totalPrice >= 10000.0B )
		modify( $sc ) {
				setTotalPrice( $tp*0.9 )

Creating a Test Scenario (Legacy)

  • Create New Asset-> Test Scenario (Legacy)
  • Resource Name: Apply Discount Test
  • Run Scenario


Creating a Test Scenario

  • Create New Asset-> Test Scenario
  • Resource Name: Apply Discount Test 2
  • Run Scenario

ClipCapIt-191210-145729.PNG ClipCapIt-191210-150035.PNG

Dealing with Recursion

  • Let us try to add a test for order value of 15000 and set EXPECT section to 13500


No-Loop Attribute

We need to ad no-loop attribute


package com.nobleprog.npproj;
import java.lang.Number;
rule "Apply Tall Order Discount"
	dialect "mvel"
	no-loop true
		$sc : ShoppingCart( $tp : totalPrice >= 10000.0B )
		modify( $sc ) {
				setTotalPrice( $tp*0.9 )
  • Correct test should look like that



Exercise 1

  • to the shopping cart fact type add "discountApplied:Boolean" field,
  • set it to true after applying a discount
  • modify rule so it will work without no-loop or other attributes

Drools Kie - Decision Table

Applying Progressive Discounts

We want to apply discounts according to the table below:

0      -  9,999  -> 0%
10,000 -  49,999 -> 10%
50,000 -  79,999 -> 12%
80,000 -  above  -> 15%

Modification to previous scenario

  • In Data Objects -> ShoppingCart add a new field discount:Double

Guided Decision Table

  • Create New Asset -> Guided Decision Table
    • Name: Progressive Discount Table
    • Hit Policy - None



Exercise 1

  1. Implement the decision table above
  2. Test if it works

Exercise 2

  1. Create another rule which would calculate totalPrice after discount has been applied

Exercise 3

  1. Add a condition to stop looping (2 solutions)

Applying Progressive Discounts - Source

  • View Source
package npou.npproj;

//from row number: 1
rule "Row 1 Progressive Decision Table"
	dialect "mvel"
		$sc : ShoppingCart( totalPrice >= 80000.0B )
		modify( $sc ) {
				setDiscount( 0.15B )

//from row number: 2
rule "Row 2 Progressive Decision Table"
	dialect "mvel"
		$sc : ShoppingCart( totalPrice >= 50000.0B , totalPrice < 80000.0B )
		modify( $sc ) {
				setDiscount( 0.12B )

//from row number: 3
rule "Row 3 Progressive Decision Table"
	dialect "mvel"
		$sc : ShoppingCart( totalPrice >= 10000.0B , totalPrice < 50000.0B )
		modify( $sc ) {
				setDiscount( 0.10B )

//from row number: 4
rule "Row 4 Progressive Decision Table"
	dialect "mvel"
		$sc : ShoppingCart( totalPrice < 10000B )
		modify( $sc ) {
				setDiscount( 0B )

Knowledge Session

Stateless Knowledge Session

  • A stateless session can be called like a function passing it some data and then receiving some results back.
  • Some common use cases for stateless sessions are, but not limited to:
    • Validation
      • Is this person eligible for a mortgage?
    • Calculation
      • Compute a mortgage premium.
    • Routing and Filtering
      • Filter incoming messages, such as emails, into folders.
  • Stateless sessions do not support iterative insertions and the method call fireAllRules()
  • The act of calling execute() is a single-shot method that will internally instantiate a KieSession, add all the user data and execute user commands, call fireAllRules(), and then call dispose()

Stateful Knowledge Session

  • Stateful Sessions are long lived and allow iterative changes over time.
  • Some common use cases for Stateful Sessions are, but not limited to:
    • Monitoring
      • Stock market monitoring and analysis for semi-automatic buying.
    • Diagnostics
      • Fault finding, medical diagnostics
    • Logistics
      • Parcel tracking and delivery provisioning
    • Compliance
      • Validation of legality for market trades.


The kmodule.xml file is the descriptor that selects resources to knowledge bases and configures those knowledge bases and sessions.

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">

  <kbase name="kbase1">
    <ksession name="ksession1"/>

  <kbase name="kbase2" packages="org.some.pkg">
    <ksession name="ksession2"/>

  <kbase name="kbase3" includes="kbase2" packages="org.some.pkg2">
    <ksession name="ksession3"/>

  <kbase name="kbase4" packages="org.some.pkg, org.other.pkg">
    <ksession name="ksession4"/>

  <kbase name="kbase5" packages="org.*">
    <ksession name="ksession5"/>

  <kbase name="kbase6" packages="org.some.*">
    <ksession name="ksession6"/>

  • 'kbase1' includes all resources from the KieModule.
  • The other KieBases include resources from other selected folders, via the 'packages' attribute.
  • Note the use wildcard '*' use, to select this package and all packages below it.