How can I use rule template in Drools 6.2, Please help me finding piece of code which can replace my existing code.
I have an existing drool features,
which basically populate the rules from database parameter. Which is working fine, but now need to improve memory and performance hence thinking to use Drools .6.2.
Existing working Code : Rule Templatetemplate header
maxPrice
minPrice
maxWeight
minWeight
type
shippingCharge
package
com.sd;
dialect "mvel"
import com.sd.shipfar.web.dto.ShipRuleDto
import com.sd.shipfar.web.dto.RuleSearchCriteriaDto
template "SHIPRULE"
rule "ShipRule@{row.rowNumber}"
no-loop
when
m : RuleSearchCriteriaDto(price >= @{minPrice} && price <= @{maxPrice})
then
response=new ShipRuleDto()
response.setShippingCharge(@{shippingCharge})
response.setMaxPrice(@{maxPrice})
response.setMinPrice(@{minPrice})
response.setMaxWeight(@{maxWeight})
response.setMaxWeight(@{minWeight})
response.setTypeAfterConversion("@{type}")
m.setDroolsResponse(response)
update(m)
end
end template
Code to evaluate rule : First I load all rules and get the session and use the session to evaluate a rule.
@PostConstruct
private void loadRules() throws Exception{
logger.info("<----Loading all rules started---->");
List<ShipRuleDocument> activeRules = mongoRepository.findAllActiveRule();
ObjectDataCompiler converter = new ObjectDataCompiler();
File file = new File("src/main/resources/ShippingCharges.drt");
FileInputStream fileInputStream = new FileInputStream(file);
String drl =converter.compile(activeRules, fileInputStream); System.out.println(drl);
KnowledgeBase kBase = KnowledgeBaseFactory.newKnow
ledgeBase();
KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowled
geBuilder();
Reader rdr = new StringReader( drl );
kBuilder.add( ResourceFactory.newReaderResource( rdr ), ResourceType.DRL ); if( kBuilder.hasErrors() ){
for( KnowledgeBuilderError err: kBuilder.getErrors() ){
System.err.println( err.toString() );
}
throw new IllegalStateException( "DRL errors" );
}
kBase.addKnowledgePackages( kBuilder.getKnowledgePackages() );
//StatelessKnowledgeSession session=kBase.newStatelessKnowledgeSession();
//session.addEventListener( new DebugAgendaEventListener() );
//useStatelessSession(session);
StatefulKnowledgeSession session = kBase.newStatefulKnowledgeSession();
session.addEventListener( new DebugAgendaEventListener() );
session.fireAllRules();
this.session=session;
logger.info("<----Loading of all rules completed---->");
}
//THIS METHOD GIVE ME REPONSE public ShipRuleDto findRule(RuleSearchCriteriaDto filter){
logger.info("Evaluating Rules for : "+filter);
FactHandle handler=session.insert(filter);
int firedRules = session.fireAllRules();
RuleSearchCriteriaDto ruleResponse = (RuleSearchCriteriaDto)session.getObject(handler);
session.retract(handler);
ShipRuleDto response=null;
if(null==ruleResponse || null==ruleResponse.getDroolsResponse()){
response = new ShipRuleDto(filter);
}else{
response = ruleResponse.getDroolsResponse();
}
logger.info("No of Rules Found = "+firedRules);
return response;
}