Drools 使用心得

1.drl definition:

package com.sample

import com.sample.DroolsTest.Holding;
import com.sample.DroolsTest.MatchingRule;

global java.util.List batchMatchingList;

declare CustomerAddress
 number: int
 streetName: String
 city: String
end

function void printRuleInfo(){
        int i ;
        i = 108;
        String str = "define local variable in my rule engine";
        java.util.List lst = new java.util.ArrayList();
        lst.add("test1");
        lst.add("test2");
        System.out.println( "local variable: " + str + " : " + i  + " : " + lst.get(1) );
}

rule "Rule 1"
salience 100
no-loop true
    when
        hd : Holding()
    then
     System.out.println ( drools.getRule().getName() +":"+ hd.getExternalId() );
     if (hd.doMatching(MatchingRule.MatchingByStock)){
      //retract(hd);
     }
        //drools.setFocus("G2");
end


rule "Rule 2"
salience 99
agenda-group "G2"
no-loop true
    when
        hd: Holding()
    then
        System.out.println ( drools.getRule().getName() +":"+ hd.getExternalId() );
        hd.doMatching(MatchingRule.MatchingByFund);
       
end


rule "Rule 3"
salience 98
agenda-group "G3"
no-loop true
    when
        hd: Holding()
    then
        System.out.println ( drools.getRule().getName() +":"+ hd.getExternalId() );
        hd.doMatching(MatchingRule.MatchingByBond);
end

 

2.java class:

package com.sample;

import java.util.ArrayList;

import org.drools.KnowledgeBase;
import org.drools.KnowledgeBaseFactory;
import org.drools.base.RuleNameEndsWithAgendaFilter;
import org.drools.base.RuleNameStartsWithAgendaFilter;
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.common.DefaultFactHandle;
import org.drools.event.rule.DefaultWorkingMemoryEventListener;
import org.drools.io.ResourceFactory;
import org.drools.logger.KnowledgeRuntimeLogger;
import org.drools.logger.KnowledgeRuntimeLoggerFactory;
import org.drools.runtime.StatefulKnowledgeSession;
import org.drools.runtime.rule.Activation;
import org.drools.runtime.rule.AgendaFilter;
import org.drools.runtime.rule.FactHandle;

/**
 * This is a sample class to launch a rule.
 */
public class DroolsTest {
 private static StatefulKnowledgeSession ksession = null;

 private static java.util.Map<String, FactHandle> holdingMapping = new java.util.HashMap<String, FactHandle>();

 public static final void main(String[] args) {
  try {
   // load up the knowledge base
   KnowledgeBase kbase = readKnowledgeBase();
   ksession = kbase.newStatefulKnowledgeSession();
   KnowledgeRuntimeLogger logger = KnowledgeRuntimeLoggerFactory.newFileLogger(ksession, "test");

   java.util.List batchMatchingList = new ArrayList();
   ksession.setGlobal("batchMatchingList", batchMatchingList);
   
   ksession.addEventListener(new DefaultWorkingMemoryEventListener());

   // go !
   Holding hd = new Holding();
   hd.externalId = "s01";

   Holding hd2 = new Holding();
   hd2.externalId = "d02";

   Holding hd3 = new Holding();
   hd3.externalId = "f03";

   Holding hd4 = new Holding();
   hd4.externalId = "s09";

   FactHandle f1 = ksession.insert(hd);
   FactHandle f2 = ksession.insert(hd2);
   FactHandle f3 = ksession.insert(hd3);
   FactHandle f4 = ksession.insert(hd4);
   
   holdingMapping.put(hd.externalId, f1);
   holdingMapping.put(hd2.externalId, f2);
   holdingMapping.put(hd3.externalId, f3);
   holdingMapping.put(hd4.externalId, f4);

   // ksession.fireAllRules(new RuleNameStartsWithAgendaFilter("F"));
   ksession.fireAllRules();

   logger.close();
  } catch (Throwable t) {
   t.printStackTrace();
  }
 }

 private static KnowledgeBase readKnowledgeBase() throws Exception {
  KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
  kbuilder.add(ResourceFactory.newClassPathResource("MatchById.drl"), ResourceType.DRL);
  //kbuilder.add(ResourceFactory.newClassPathResource("MatchByDetail.drl"), ResourceType.DRL);
  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;
 }

 public static class Holding {
  private String externalId;
  private String externalName;

  public String getExternalId() {
   return externalId;
  }

  public String getExternalName() {
   return externalName;
  }

  public void doBatchMatching(MatchingRule matchingRule) {
   java.util.List batchMatchingList = (java.util.List) ksession.getGlobal("batchMatchingList");

   for (int i = 0; i < batchMatchingList.size(); i++) {
    String externalId = (String) batchMatchingList.get(i);

    Boolean isMatched = false;
    switch (matchingRule) {
    case MatchingByStock:
     if (externalId.startsWith("s0")) {
      isMatched = true;
     }
     break;
    case MatchingByBond:
     if (externalId == "d02") {
      isMatched = true;
     }
     break;
    case MatchingByFund:
     if (externalId == "f03") {
      isMatched = true;
     }
     break;

    default:
     break;
    }
    if (isMatched) {
     System.out.println("  ==> backend matched: " + matchingRule + "  --->>> " + externalId);

     FactHandle handle = holdingMapping.get(externalId);
     DroolsTest.ksession.retract(handle);
    }
   }
   
   ksession.getAgenda().getAgendaGroup("AfterDoMatching").setFocus();

   //ksession.fireAllRules(new RuleNameStartsWithAgendaFilter("AfterDoMatching"));
  }

  public Boolean doMatching(MatchingRule matchingRule) {
   Boolean isMatched = false;
   switch (matchingRule) {
   case MatchingByStock:
    if (externalId.startsWith("s0")) {
     isMatched = true;
    }
    break;
   case MatchingByBond:
    if (externalId == "d02") {
     isMatched = true;
    }
    break;
   case MatchingByFund:
    if (externalId == "f03") {
     isMatched = true;
    }
    break;

   default:
    break;
   }
   if (isMatched) {
    System.out.println("  ==> backend matched: " + matchingRule + "  --->>> " + externalId);

    FactHandle handle = DroolsTest.ksession.getFactHandle(this);
    DroolsTest.ksession.retract(handle);
   }
   return isMatched;
  }

 }

 public static enum MatchingRule {
  MatchingByStock, MatchingByBond, MatchingByFund,
 }


}

 

多个Fact时,如:m个c1,n个c2,最多要处理m*n个rule,最好在能处理fact时,retract掉当前fact

 

解决Eclipse中使用drool时报Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath的问题。 详细错误: org.drools.RuntimeDroolsException: Unable to load dialect 'org.drools.rule.builder.dialect.java.JavaDialectConfiguration:java:org.drools.rule.builder.dialect.java.JavaDialectConfiguration' at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:283) at org.drools.compiler.PackageBuilderConfiguration.buildDialectConfigurationMap(PackageBuilderConfiguration.java:268) at org.drools.compiler.PackageBuilderConfiguration.init(PackageBuilderConfiguration.java:181) at org.drools.compiler.PackageBuilderConfiguration.(PackageBuilderConfiguration.java:159) at org.drools.compiler.PackageBuilder.(PackageBuilder.java:210) at org.drools.compiler.PackageBuilder.(PackageBuilder.java:143) at org.drools.builder.impl.KnowledgeBuilderFactoryServiceImpl.newKnowledgeBuilder(KnowledgeBuilderFactoryServiceImpl.java:34) at org.drools.builder.KnowledgeBuilderFactory.newKnowledgeBuilder(KnowledgeBuilderFactory.java:47) at main.com.flashsky.server.core.aml.rules.Test.testDrool(Test.java:18) at test.com.flashsky.server.core.aml.rules.TestTest.testTestDrool(TestTest.java:9) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:44) at org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:15) at org.junit.runners.model.FrameworkMethod.invokeExplosively(FrameworkMethod.java:41) at org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:20) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:73) at org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:46) at org.junit.runners.ParentRunner.runChildren(ParentRunner.java:180) at org.junit.runners.ParentRunner.access$000(ParentRunner.java:41) at org.junit.runners.ParentRunner$1.evaluate(ParentRunner.java:173) at org.junit.internal.runners.statements.RunBefores.evaluate(RunBefores.java:28) at org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:31) at org.junit.runners.ParentRunner.run(ParentRunner.java:220) at org.eclipse.jdt.internal.junit4.runner.JUnit4TestReference.run(JUnit4TestReference.java:46) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:467) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:683) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:390) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:197) Caused by: java.lang.RuntimeException: The Eclipse JDT Core jar is not in the classpath at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.setCompiler(JavaDialectConfiguration.java:94) at org.drools.rule.builder.dialect.java.JavaDialectConfiguration.init(JavaDialectConfiguration.java:55) at org.drools.compiler.PackageBuilderConfiguration.addDialect(PackageBuilderConfiguration.java:279) ... 33 more
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值