У меня есть проект Maven с правилами в .drl
файлах и другой проект, который является SpringBoot
веб-сервером.Правила могут быть отправлены POST-запросом на сервер, после чего они добавляются в проект Maven и могут быть активированы, как если бы они были там с самого начала.
Правила «замечены», потому что я обновляюПроект правил Maven (вызывая его mvn clean install
) каждый раз, когда передается новое правило.
Я перепробовал множество конфигураций, наиболее «логичными» кадрами являются следующие два:
Первыйtry:
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId("ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieBaseConfiguration config = ks.newKieBaseConfiguration();
config.setOption(EventProcessingOption.STREAM);
KieBase kieBase = kContainer.newKieBase("myKBase", config);
KieSession kSession = kieBase.newKieSession();
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000); // check for rule changes every 10 seconds
return kSession;
}
...
N-й try:
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieFileSystem kfs = ks.newKieFileSystem();
KieModuleModel kModule = ks.newKieModuleModel();
KieBaseModel baseModel = kModule.newKieBaseModel("defaultKieBase")
.setDefault(true)
.setEventProcessingMode(EventProcessingOption.STREAM);
baseModel.newKieSessionModel("defaultKSession")
.setDefault(true)
.setClockType(ClockTypeOption.get("pseudo"));
kfs.writeKModuleXML(kModule.toXML());
KieBuilder kieBuilder = ks.newKieBuilder( kfs ).buildAll();
System.out.println("ERRORS: " + kieBuilder.getResults().getMessages(Message.Level.ERROR).size());
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId(
"ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieSession kSession = kContainer.newKieSession();
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000); // check for rule changes every 10 seconds
return kSession;
}
Любая помощь приветствуется, особенно с объяснением того, почему ваш код работает, а мойне делает.:)
Примечание: приведенный ниже код работает, но я не могу использовать выражение over window:time(5m)
drools, поскольку для него требуется STREAM EventProcessing
.
@Bean
public KieSession kieSession() {
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.newKieContainer(ks.newReleaseId("ftn.bsep9","drools-spring-kjar", "0.0.1-SNAPSHOT"));
KieScanner kScanner = ks.newKieScanner(kContainer);
kScanner.start(10000);
return kContainer.newKieSession();
}