在Drools 6中从数据库加载和更新规则

use*_*069 4 java drools

如何在启动时从数据库表加载规则并从Drools 6.2.0中的同一个表更新它们?我找到了一个使用Drools 5 的例子,我可以将其从Scala转换为Java,但看起来API已经发生了巨大变化......例如,我没有看到RuleBaseFactory类.

任何样品或文件将不胜感激.

lau*_*une 8

我不确定从哪里org.drools.RuleBaseFactory开始.下面是在Drools 5.3(以及可能更早的话)中完成的工作方式,最高可达5.6:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
kbuilder.add( ..., ResourceType.DRL);
if( kbuilder.hasErrors() ){
    System.err.println( "### compilation errors ###" );
    KnowledgeBuilderErrors errors = kbuilder.getErrors();
    for( KnowledgeBuilderError err: errors ){
        System.err.println( err.toString() );
    }
    throw new IllegalStateException( "compile errors" );
}
KnowledgeBase kbase = kbuilder.newKnowledgeBase();
StatelessKnowledgeSession ksession = kbase.newStatelessKnowledgeSession();
Run Code Online (Sandbox Code Playgroud)

省略号表示插入包含规则文本的数据的位置.检查API是否有合适的类型; a java.lang.String应该可以接受.

这是我用于6.2的方式:

KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
kfs.write( "src/main/resources/simple.drl", ... );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
    System.out.println( results.getMessages() );
    throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer =
    kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieContainer.newKieSession();
Run Code Online (Sandbox Code Playgroud)


小智 6

drools-templates具有ResultSetGenerator.java,它具有方法compile(resultSet,template)来完成这项工作。

我有来自HTTP的数据要转换为规则。我找到了一种使用ObjectDataCompiler做到这一点的方法。可能有些人可能会觉得这很有用。

ObjectDataCompiler compiler = new ObjectDataCompiler();
String generatedDRL = compiler.compile(ruleAttributes, new FileInputStream(REGULATION_TEMPLATE_FILE));
Run Code Online (Sandbox Code Playgroud)

其中ruleAttributes是

List<Map<String, String>> ruleAttributes = new ArrayList<>();
Map<String, String> rule1 = new HashMap<>();
rule1.put("ruleid", "2");
rule1.put("ifcondition", "abc: Abc(xyz.getId() == 2);");
rule1.put("thencondition", "myGlobal.setPqr(200.1D);");
ruleAttributes.add(rule1);
Run Code Online (Sandbox Code Playgroud)

然后可以这样创建KieBase:

KieServices kieServices = KieServices.Factory.get();

KieHelper kieHelper = new KieHelper();

//multiple such resoures/rules can be added
byte[] b1 = generatedDRL.getBytes();
Resource resource1 = kieServices.getResources().newByteArrayResource(b1);
kieHelper.addResource(resource1, ResourceType.DRL);

KieBase kieBase = kieHelper.build();
Run Code Online (Sandbox Code Playgroud)

规则可以这样应用:

KieSession kieSession = kieBase.newKieSession();
kieSession.setGlobal("myGlobal", myGlobal);
kieSession.insert(abc);
int numberOfRulesFired = kieSession.fireAllRules();
kieSession.dispose();
Run Code Online (Sandbox Code Playgroud)

模板文件如下所示:

template header
ruleid
ifcondition
thencondition

import fk.sp.seldon.msku.MSKU

global com.something.blah.MyGlobal myGlobal

template "tmp1"

rule "@{ruleid}"
  dialect "mvel"
  when
    @{ifcondition}
  then
    @{thencondition};
end
end template
Run Code Online (Sandbox Code Playgroud)