Я создаю приложение весенней загрузки с Gradle и версией 7.20 drools. Мы загружаем базу знаний drools из файла внешнего ресурса по пути drl_file_path
. Ниже приведен мой код конфигурации.
@Configuration
public class DroolConfig {
KieServices kieServices = KieServices.Factory.get();
@Bean
public KieFileSystem kieFileSystem() throws IOException {
KieFileSystem kieFileSystem =kieServices.newKieFileSystem();
kieFileSystem.write(ResourceFactory.newFileResource(new File("drl_file_path")));
return kieFileSystem;
}
@Bean
public KieContainer kieContainer() throws IOException{
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem());
kieBuilder.buildAll();
KieModule kieModule = kieBuilder.getKieModule();
KieContainer kieContainer = kieServices.newKieContainer(kieModule.getReleaseId());
KieScanner kScanner = kieServices.newKieScanner(kieContainer);
kScanner.start( 10000L );
return kieContainer;
}
@Bean
public KieScanner kieScanner() throws IOException{
return kieServices.newKieScanner(kieContainer());
}
}
Есть шанс, что нам нужно обновить правило drools, и мы хотим обновить базу знаний drools, не перезагружая сервер, мы используем KieScanner.sacnNow()
, который не работает, что является ключевым моментом, который я упускаю. Ниже приведен код перезагрузить и применить слюни правило-
@Component
public class DroolComponent {
@Autowired private KieContainer kieContainer;
@Autowired private KieScanner kieScanner;
public Customer reloadDroolsAndApply(Customer customer) {
kieScanner.scanNow();
//above scanning not applying updated rules.
KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(customer);
kieSession.fireAllRules();
kieSession.dispose();
return customer;
}
}