I am creating a spring boot app with Gradle and 7.20 drools version.We are loading drools knowledge base from an external resource file place at path drl_file_path
.Below is my configuration code.
@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());
}
}
There is a chance we have to update drools rule, and we want to update drools knowledge base without restarting the server, we are using KieScanner.sacnNow()
which is not working, what is the key point I am missing.Below is code to reload and apply drools rule-
@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;
}
}