Drools is a open source Business Logic integration Platform based on java from JBoss and RedHat. Here is one simple example to execute business logics based on rules. see more about drools
1. Create a maven project and add below dependencies
<dependencies>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-compiler</artifactId>
<version>6.0.0.CR1</version>
</dependency>
<dependency>
<groupId>org.drools</groupId>
<artifactId>drools-core</artifactId>
<version>6.0.0.CR1</version>
</dependency>
</dependencies>
2. Create a .drl file to add our business logic (eligibility.drl)
import com.vinod.test.Customer
dialect "mvel"
rule "Customer eligibility rule"
when
$customer : Customer(age>=21)
then
System.out.println($customer.name" Eligibile for benefits");
end
3. Create Customer pojo class
package com.vinod.test;
public class Customer {
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
public class Customer {
private String name;
private int age;
public Customer() {
}
public Customer(String name, int age) {
this.name = name;
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
}
4. Create a main class to load and fire rules
package com.vinod.test;
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class CustomerEligibilityRuleTest {
public static void main(String[] args) {
List<File> rules = new ArrayList<File>();
File currentdir = new File(System.getProperty("user.dir"));
File[] listFiles = currentdir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return (name.endsWith(".drl"));
}
});
for (File listFile : listFiles) {
System.out.println(listFile.getName());
rules.add(listFile);
}
List<Customer> customers = new ArrayList<Customer>();
customers.add(new Customer("Vinod k kumaran", 21));
executeRules(rules, customers);
}
public static void executeRules(List<File> files, List<Customer> customers) {
try {
KieServices kieServices = KieServices.Factory.get();
KieResources kieResources = kieServices.getResources();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
KieRepository kieRepository = kieServices.getRepository();
for (File ruleFile : files) {
Resource resource = kieResources.newFileSystemResource(ruleFile);
kieFileSystem.write(resource);
}
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
KieSession kSession = kContainer.newKieSession();
kSession.addEventListener(new CustomerRuleTracker());
for (Object customer : customers) {
kSession.insert(customer);
}
kSession.fireAllRules();
} catch (Exception e) {
e.printStackTrace();
}
}
}
import java.io.File;
import java.io.FilenameFilter;
import java.util.ArrayList;
import java.util.List;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.KieRepository;
import org.kie.api.io.KieResources;
import org.kie.api.io.Resource;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
public class CustomerEligibilityRuleTest {
public static void main(String[] args) {
List<File> rules = new ArrayList<File>();
File currentdir = new File(System.getProperty("user.dir"));
File[] listFiles = currentdir.listFiles(new FilenameFilter() {
public boolean accept(File dir, String name) {
return (name.endsWith(".drl"));
}
});
for (File listFile : listFiles) {
System.out.println(listFile.getName());
rules.add(listFile);
}
List<Customer> customers = new ArrayList<Customer>();
customers.add(new Customer("Vinod k kumaran", 21));
executeRules(rules, customers);
}
public static void executeRules(List<File> files, List<Customer> customers) {
try {
KieServices kieServices = KieServices.Factory.get();
KieResources kieResources = kieServices.getResources();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
KieRepository kieRepository = kieServices.getRepository();
for (File ruleFile : files) {
Resource resource = kieResources.newFileSystemResource(ruleFile);
kieFileSystem.write(resource);
}
KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);
kb.buildAll();
KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());
KieSession kSession = kContainer.newKieSession();
kSession.addEventListener(new CustomerRuleTracker());
for (Object customer : customers) {
kSession.insert(customer);
}
kSession.fireAllRules();
} catch (Exception e) {
e.printStackTrace();
}
}
}
5. Add rule tracker class to listen all stages of firing rules
This class is added in the KieSession already in the above main class
package com.vinod.test;
import org.drools.core.event.BeforeActivationFiredEvent;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.DefaultAgendaEventListener;
import org.kie.api.event.rule.MatchCancelledEvent;
import org.kie.api.event.rule.MatchCreatedEvent;
import org.kie.api.event.rule.MatchEvent;
import org.kie.api.event.rule.RuleFlowGroupActivatedEvent;
public class CustomerRuleTracker extends DefaultAgendaEventListener {
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
System.out.println("Executing afterMatchFired ");
}
@Override
public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {
System.out.println("Executing beforeRuleFlowGroupActivated ");
}
@Override
public void beforeMatchFired(BeforeMatchFiredEvent event) {
System.out.println("Executing beforeMatchFired ");
}
public void beforeActivationFired(BeforeActivationFiredEvent event) {
System.out.println("Executing beforeActivationFired ");
}
@Override
public void matchCreated(MatchCreatedEvent event) {
System.out.println("Executing matchCreated ");
registerActions(event);
}
@Override
public void matchCancelled(MatchCancelledEvent event) {
System.out.println("Executing matchCancelled");
}
private void registerActions(MatchEvent event) {
System.out.println("Executing registerActions");
}
}
import org.drools.core.event.BeforeActivationFiredEvent;
import org.kie.api.event.rule.AfterMatchFiredEvent;
import org.kie.api.event.rule.BeforeMatchFiredEvent;
import org.kie.api.event.rule.DefaultAgendaEventListener;
import org.kie.api.event.rule.MatchCancelledEvent;
import org.kie.api.event.rule.MatchCreatedEvent;
import org.kie.api.event.rule.MatchEvent;
import org.kie.api.event.rule.RuleFlowGroupActivatedEvent;
public class CustomerRuleTracker extends DefaultAgendaEventListener {
@Override
public void afterMatchFired(AfterMatchFiredEvent event) {
System.out.println("Executing afterMatchFired ");
}
@Override
public void beforeRuleFlowGroupActivated(RuleFlowGroupActivatedEvent event) {
System.out.println("Executing beforeRuleFlowGroupActivated ");
}
@Override
public void beforeMatchFired(BeforeMatchFiredEvent event) {
System.out.println("Executing beforeMatchFired ");
}
public void beforeActivationFired(BeforeActivationFiredEvent event) {
System.out.println("Executing beforeActivationFired ");
}
@Override
public void matchCreated(MatchCreatedEvent event) {
System.out.println("Executing matchCreated ");
registerActions(event);
}
@Override
public void matchCancelled(MatchCancelledEvent event) {
System.out.println("Executing matchCancelled");
}
private void registerActions(MatchEvent event) {
System.out.println("Executing registerActions");
}
}
6. Run the main program.
We can see the customer name + eligible for benefits printed as per our rules..
eligibility.drl
Executing matchCreated
Executing registerActions
Executing beforeMatchFired
Vinod k kumaran Eligibile for benefits
Executing afterMatchFired
Executing matchCreated
Executing registerActions
Executing beforeMatchFired
Vinod k kumaran Eligibile for benefits
Executing afterMatchFired
No comments:
Post a Comment