Initial Setup
Before developing the BRMS rules engine project we need to install BRMS Rule engine and JBoss Developer studio as explained below
Use below link to install the BRMS Rule Engine.
1. Install BRMS Rule
2. Install JBOSS Developer Studio
This section will explain how to create the BRMS rule project using JBoss Developer studio
6. Select the below path in Drools Runtime Environment Path section and click OK
<BRMS Standalone home>\jboss-as-web\server\default\deploy\jboss-brms.war\WEB-INF\li
New BRMS Rule Creation
In this section I will explain how to create & test the small rules
1. Right click on src/main/rules and select the Rules Resource and click on the Next button
package com.sample rule "Your First Rule" when #condition then #action end rule " Your Second Rule" #include attribute such as "salience here.... when #condition then #action end
rule "cost Center" ruleflow-group "group1" when m:Metadata(member.length==8) then m.setMessage("Cost Center Metadata is Valid"); end
1. Right click on src/main/rules and select other which will open the new Flow file wizards.
2. Select the “Flow File” and click next which will move to next screen where you can give the Rule flow file name click finish which creates the new Flow File with component bar on left side.
3. Select the Rule task and place into rule drawing pane.
4. Open the Rule flow property and give the name of the Rule task and link it to with rule putting group1 on RuleFlowGroup section. If you remember we have add the rule flow group as group1 which will link rule flow with Cost Center rul.
Rule Testing
1. Create new ValidationTest class to test Rules
2. Write the method readKnowledgeBase which is already available in sample or you can use below code as well
package com.sample; import org.drools.KnowledgeBase; import org.drools.KnowledgeBaseFactory; import org.drools.builder.KnowledgeBuilder; import org.drools.builder.KnowledgeBuilderError; import org.drools.builder.KnowledgeBuilderErrors; import org.drools.builder.KnowledgeBuilderFactory; import org.drools.builder.ResourceType; import org.drools.io.ResourceFactory; import org.drools.logger.KnowledgeRuntimeLogger; import org.drools.logger.KnowledgeRuntimeLoggerFactory; import org.drools.runtime.StatefulKnowledgeSession; public class ValidationTest { public static final String DRL_URL = "Validation.drl"; public static final String RULE_FLOW_URL = "ruleflow.rf"; public static final void main(String[] args) { try { // load up the knowledge base ValidationTest procTest = new ValidationTest(); Metadata metadata = new Metadata(); metadata.setMember("FD1111"); String result = procTest.testRule(metadata); } catch (Throwable t) { t.printStackTrace(); } } public String testRule(Metadata metadata) { try { // load up the knowledge base KnowledgeBase kbase = readKnowledgeBase(); StatefulKnowledgeSession ksession = kbase .newStatefulKnowledgeSession(); ksession.insert(metadata); KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory .newFileLogger(ksession, "test"); // start a new process instance ksession.startProcess("com.sample.ruleflow"); ksession.fireAllRules(); logger.close(); } catch (Throwable t) { t.printStackTrace(); } return metadata.getMessage(); } private static KnowledgeBase readKnowledgeBase() throws Exception { KnowledgeBuilder kbuilder = KnowledgeBuilderFactory .newKnowledgeBuilder(); kbuilder.add(ResourceFactory.newClassPathResource(DRL_URL), ResourceType.DRL); kbuilder.add(ResourceFactory.newClassPathResource(RULE_FLOW_URL), ResourceType.DRF); KnowledgeBuilderErrors errors = kbuilder.getErrors(); if (errors.size() > 0) { for (KnowledgeBuilderError error : errors) { System.err.println(error); } throw new IllegalArgumentException("Could not parse knowledge."); } KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(); kbase.addKnowledgePackages(kbuilder.getKnowledgePackages()); return kbase; } }
4. Right click on the test class and run as Java Application which will provide you output on console
I can assume we have understood how to create the simple BRMS rules and test the same. In this section I would try to explore the complex rules creation. We will also learn how to prioritize & routing of rules using the rules flow. We will also see the proper use of Rule flow group.
Below are the rules which will be implementing using the BRMS
1. If Dimension of Metadata is CC then member length should be 8
2. if Dimension of Metadata is FE then member length should be 6
3. Dimension of Metadata should either be CC or FE
Rule Creation
Below code depicts the different rules have been created to cater the above validation. If you see carefully explored then you will find that I grouped rules in different group’s group1, group2 and group3 . In this way we can instruct to the rules engine to run the group of rules separately.
#created on: Jun 29, 2011 package com.sample #list any import classes here. import com.sample.Metadata; rule "Cost Center" ruleflow-group "group1" when m: Metadata (member.length == 8 ) then System.out.println("Cost Center Metadata is Valid"); m.setMessage("Cost Center Metadata is Valid"); end rule "Cost Center Invalid" ruleflow-group "group1" when m: Metadata (member.length != 8 ) then System.out.println("Cost Center Metadata is Invalid"); m.setMessage("Cost Center Metadata is Invalid"); end rule "Fund Entity" ruleflow-group "group2" when m: Metadata (member.length == 6) then System.out.println("Fund Entity Metadata is Valid"); m.setMessage("Fund Entity Metadata is Valid"); end rule "Fund Entity Invalid" ruleflow-group "group2" when m: Metadata (member.length != 6) then System.out.println("Fund Entity Metadata is Invalid"); m.setMessage("Fund Entity Metadata is Invalid"); end rule "Not Valid" ruleflow-group "group3" when m: Metadata (eval(true)) then System.out.println("Meta Data Not Valid"); m.setMessage("Meta Data Not Valid"); //m.setStatus("FE"); end
Rule Flow Creation
We branched rule in three category i.e. CC, FE & Else. If dimension is CC then executes the CC related rules i.e. group1. if dimension is FE then execute FE related rule i.e. group2. If dimension is neither CC nor FE then execute Else part of the rule i.e. group3.
1. Create the new rule file
2. Select the” Start” & “End” component and add into pane
3. Add the Gateway diverge
4. Add 3 “Rule Task” components in the pane as mentioned in below figures.
5. Add the Gateway Converge as mentioned in the below figure