Performance and memory : Rule Template : Drolls 5.2 to Drolls 6 : RULE template database driven

470 views
Skip to first unread message

pranav tiwary

unread,
Dec 16, 2015, 3:49:37 AM12/16/15
to Drools Usage
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 Template

template 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.newKnowledgeBase();
        KnowledgeBuilder kBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        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;
    }

Mario Fusco

unread,
Dec 17, 2015, 3:44:37 AM12/17/15
to Drools Usage
Hi,

integration with Drools template have been fixed in Drools 6.3 as reported here https://issues.jboss.org/browse/DROOLS-867
If you use Drools 6.3 instead of 6.2 your use case should work.

Cheers,
Mario

--
You received this message because you are subscribed to the Google Groups "Drools Usage" group.
To unsubscribe from this group and stop receiving emails from it, send an email to drools-usage...@googlegroups.com.
To post to this group, send email to drools...@googlegroups.com.
To view this discussion on the web visit https://groups.google.com/d/msgid/drools-usage/e2d00557-d587-4519-a6b6-c3e4a94bb5cc%40googlegroups.com.
For more options, visit https://groups.google.com/d/optout.

pranav tiwary

unread,
Dec 22, 2015, 2:14:55 AM12/22/15
to Drools Usage
Thank you Mario, can you please help me with one example if there is any.

Mario Fusco

unread,
Dec 23, 2015, 3:47:30 AM12/23/15
to Drools Usage
Reply all
Reply to author
Forward
0 new messages