所以目前我正在练习将 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();
}
具有定义的规则
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 并部署在 Web 服务器中。
我读过多篇有关使用的文章KieScanner
但关于它的书面教程都没有意义,甚至文档本身也是如此。按照他们提供的示例代码,
KieScanner kieScanner = kieServices.newKieScanner(kieContainer);
总是导致构建失败,因为 newKieScanner 似乎无法基于提供的 kieContainer 创建 kieScanner 。是否有其他方法可以为 Drools 设置动态规则或澄清如何正确实施 KieScanner?
谢谢。