Загрузка и обновление правил из базы данных в Drools 6

Как можно было бы загружать правила из таблицы базы данных при запуске и обновлять их из той же таблицы в Drools 6.2.0? Я нашел пример с помощью Drools 5, который, вероятно, мог бы преобразовать из Scala в Java, но похоже, что API сильно изменился … Например, я не вижу class RuleBaseFactory.

Любой образец или документация будут оценены по достоинству.

Я не уверен, откуда взялся этот org.dools.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(); 

Эллипсис указывает место для вставки данных, содержащих текст правила. Проверьте API для подходящих типов; 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(); 

drools-templates имеет ResultSetGenerator.java, который имеет метод compile (resultSet, template) для выполнения задания.

У меня были данные, поступающие через HTTP, для преобразования в правило. Я нашел способ сделать это с помощью ObjectDataCompiler. Может быть, некоторые люди могут найти это полезным.

 ObjectDataCompiler compiler = new ObjectDataCompiler(); String generatedDRL = compiler.compile(ruleAttributes, new FileInputStream(REGULATION_TEMPLATE_FILE)); 

где ruleAttributes

 List> ruleAttributes = new ArrayList<>(); Map 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); 

Затем 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(); 

Правила могут применяться следующим образом:

 KieSession kieSession = kieBase.newKieSession(); kieSession.setGlobal("myGlobal", myGlobal); kieSession.insert(abc); int numberOfRulesFired = kieSession.fireAllRules(); kieSession.dispose(); 

Файл шаблона выглядит так:

 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