Динамическое обновление правил во время выполнения.Слюни + Spring-Boot - PullRequest
0 голосов
/ 13 ноября 2018

Так что в настоящее время я тренируюсь по использованию Drools (7.13.0.Final) с Spring-boot (1.5.12.RELEASE).Я сделал пример приложения в Spring-boot со следующими классами

Модель: TaxiFare.java

@Data
public class TaxiFare {
    private double surge;
    private double netFare;
    private double baseFare;
    private double distanceTraveled;
}

Сервис: TaxiFareService.java

@Service
public class TaxiFareService {

    @Autowired
    private KieContainer kieContainer;


    public TaxiFare getTaxiFare(TaxiFare fare) {

        KieSession kieSession = kieContainer.newKieSession("rulesSession");

        kieSession.insert(fare);
        kieSession.fireAllRules();
        kieSession.dispose();
        return fare;
    }
}

RestController:TaxiFareController.java

@RestController
public class TaxiFareController {

    @Autowired
    private TaxiFareService taxiFareService;

    @RequestMapping(value = "/getFare", method = RequestMethod.GET)
    public String getQuestions(@RequestParam(required = true) double baseFare, @RequestParam(required = true) double surge, @RequestParam(required = true) double distanceTraveled) {

        TaxiFare fare = new TaxiFare();
        fare.setBaseFare(baseFare);
        fare.setSurge(surge);
        fare.setDistanceTraveled(distanceTraveled);

        taxiFareService.getTaxiFare(fare);

        return String.format("NET FARE IS: %s", fare.getNetFare());
    }


}

Конфигурация:

@Bean
public KieContainer kieContainer2() {
    return KieServices.Factory.get().getKieClasspathContainer();
}

С определенными правилами

package rules

import com.samsung.bixby.management.drools.model.TaxiFare

rule "No Surge"
    when
        $fareObject: TaxiFare(surge == 0.0);
    then
        $fareObject.setNetFare($fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end
rule "Has Surge"
    when
        $fareObject: TaxiFare(surge > 0.0);
    then
        $fareObject.setNetFare($fareObject.getSurge() * $fareObject.getBaseFare() * $fareObject.getDistanceTraveled());
end

Я создал этот пример приложения с использованием различных интеграций Drools + Springучебники, которые я нашел в Интернете.В настоящее время механизм правил работает нормально как есть, но я пытаюсь сделать так, чтобы я хотел иметь возможность динамически перезагружать файл правил во время выполнения приложения каждый раз, когда добавляется новое правило или изменяется существующее правило.Приложение упаковано в виде WAR и развернуто на веб-сервере.

Я прочитал несколько статей, касающихся использования KieScanner, но ни один из письменных руководств по этому поводу не имеет смысла, даже сама документация.Следуя предоставленному образцу кода,

KieScanner kieScanner = kieServices.newKieScanner(kieContainer);

Всегда приводит к сбою сборки, поскольку каким-то образом newKieScanner не может создать kieScanner на основе предоставленного kieContainer.Есть ли другой способ настроить динамические правила для Drools или разъяснить, как правильно реализовать KieScanner?

Спасибо.

1 Ответ

0 голосов
/ 08 февраля 2019

Вы можете попробовать это, на самом деле отлично работает

 @Test
public void messageRuleFromUTFString() {
 String ruleContent =
     "package rules\r\n"+
     "import mypackage.Message\r\n" +
         "rule \"myrule\"\r\n" +
        "    \twhen\r\n" +
        "        $id : Message([\"38196-2\"] contains id)\r\n" +
        "    then\r\n" +
        "\t\tSystem.out.println(\"Works!\");\r\n" +
        "end\r\n";
    KieSession kSession = null;
    try {
        KnowledgeBuilder kb = KnowledgeBuilderFactory.newKnowledgeBuilder();
        kb.add(ResourceFactory.newByteArrayResource(ruleContent.getBytes("utf-8")), ResourceType.DRL);

        KnowledgeBuilderErrors errors = kb.getErrors();
        for (KnowledgeBuilderError error : errors) {
            System.out.println(error);
        }
        InternalKnowledgeBase kBase = KnowledgeBaseFactory.newKnowledgeBase();
        kBase.addPackages(kb.getKnowledgePackages());
        kSession = kBase.newKieSession();
        kSession.insert(createMessage("38196-2"));
        kSession.fireAllRules();

    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    } finally {
        if (kSession != null)
            kSession.dispose();
    }
}

Кредиты одному из пользователей github.Мой пример слегка изменен до последней версии слюней: https://github.com/ityouknow/drools-examples.git

...