Так что в настоящее время я тренируюсь по использованию 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?
Спасибо.