向单例KieContainer添加新规则,同时保留现有规则。

huangapple go评论117阅读模式
英文:

Add new rules to singleton KieContainer by preserving existing rules

问题

配置类:

  1. @Configuration
  2. public class DynamicDroolsConfig {
  3. private KieServices kieServices;
  4. @Autowired
  5. private IPersistentSessionService iPersistentSessionService;
  6. @PostConstruct
  7. private void init() {
  8. this.initDataSource();
  9. this.kieServices = KieServices.Factory.get();
  10. }
  11. @Bean
  12. public KieSession getPersistentKieSession() {
  13. List<SessioninfoEntity> sessioninfoEntities = iPersistentSessionService.getStoredSessionDetails();
  14. if (sessioninfoEntities.size() == 0) {
  15. return newSession();
  16. } else if (sessioninfoEntities.size() == 1) {
  17. return persistedSession(sessioninfoEntities.get(0));
  18. } else {
  19. // todo other things
  20. return null;
  21. }
  22. }
  23. @Bean
  24. public KieServices getKieServices() {
  25. return this.kieServices;
  26. }
  27. @Bean
  28. public KieContainer getKieContainer() {
  29. getFileSystem();
  30. KieRepository kieRepository = kieServices.getRepository();
  31. kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
  32. KieBuilder kb = kieServices.newKieBuilder(getFileSystem()).buildAll();
  33. KieModule kieModule = kb.getKieModule();
  34. return kieServices.newKieContainer(kieModule.getReleaseId());
  35. }
  36. @Bean
  37. public KieFileSystem getFileSystem() {
  38. KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
  39. return kieFileSystem;
  40. }
  41. public Environment getEnv() {
  42. Environment env = kieServices.newEnvironment();
  43. env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory("org.drools.persistence.jpa"));
  44. env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
  45. return env;
  46. }
  47. private void initDataSource() {
  48. PoolingDataSource ds = new PoolingDataSource();
  49. ds.setUniqueName("jdbc/BitronixJTADataSource");
  50. ds.setClassName("com.mysql.cj.jdbc.MysqlXADataSource");
  51. ds.setMaxPoolSize(3);
  52. ds.setAllowLocalTransactions(true);
  53. ds.getDriverProperties().put("user", "root");
  54. ds.getDriverProperties().put("password", "1234");
  55. ds.getDriverProperties().put("URL", "jdbc:mysql://localhost:3306/drool_demo");
  56. ds.init();
  57. }
  58. private KieSession newSession() {
  59. return kieServices.getStoreServices().newKieSession(getKieContainer().getKieBase(), null, getEnv());
  60. }
  61. private KieSession persistedSession(SessioninfoEntity sessioninfoEntity) {
  62. return kieServices.getStoreServices().loadKieSession(sessioninfoEntity.getId(), getKieContainer().getKieBase(), null, getEnv());
  63. }
  64. }

容器 releaseId 更新方法:

  1. @Service
  2. public class DroolsUtilityImpl implements IDroolsUtility {
  3. @Autowired
  4. private KieFileSystem fileSystem;
  5. @Autowired
  6. private KieServices services;
  7. @Autowired
  8. private KieContainer container;
  9. @Override
  10. public void updateContainer(String rules) {
  11. fileSystem.write("src/main/resources/rules/rule.drl", rules);
  12. KieBuilder kb = services.newKieBuilder(fileSystem).buildAll();
  13. KieModule kieModule = kb.getKieModule();
  14. container.updateToVersion(kieModule.getReleaseId());
  15. }
  16. @Override
  17. public void viewContainerRules() {
  18. KieBase kieBase = container.getKieBase();
  19. for (KiePackage kp : kieBase.getKiePackages()) {
  20. for (Rule rule : kp.getRules()) {
  21. System.out.println(rule.getName());
  22. }
  23. }
  24. }
  25. }
英文:

I am trying to add new rules to a singleton KieContainer having session persistence, in a Spring Boot project. I have implemented the programmatic approach for addition of new rules to the KieContainer but the existing rules are getting replaced everytime I update the ReleaseID of the KieContainer. What I want is to preserve the existing rules that is present in the Drools Session and add new rules to that. The updateContainer() function from my utility class is how I am making changes to the KieContainer. Any suggestions mostly welcomed. My implementation is as follows:

Configuration class:

  1. @Configuration
  2. public class DynamicDroolsConfig {
  3. private KieServices kieServices;
  4. @Autowired
  5. private IPersistentSessionService iPersistentSessionService;
  6. @PostConstruct
  7. private void init() {
  8. this.initDataSource();
  9. this.kieServices = KieServices.Factory.get();
  10. }
  11. @Bean
  12. public KieSession getPersistentKieSession() {
  13. List&lt;SessioninfoEntity&gt; sessioninfoEntities = iPersistentSessionService.getStoredSessionDetails();
  14. if (sessioninfoEntities.size() == 0) {
  15. return newSession();
  16. } else if (sessioninfoEntities.size() == 1) {
  17. return persistedSession(sessioninfoEntities.get(0));
  18. } else {
  19. // todo other things
  20. return null;
  21. }
  22. }
  23. @Bean
  24. public KieServices getKieServices() {
  25. return this.kieServices;
  26. }
  27. @Bean
  28. public KieContainer getKieContainer() {
  29. getFileSystem();
  30. KieRepository kieRepository = kieServices.getRepository();
  31. kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
  32. KieBuilder kb = kieServices.newKieBuilder(getFileSystem()).buildAll();
  33. KieModule kieModule = kb.getKieModule();
  34. return kieServices.newKieContainer(kieModule.getReleaseId());
  35. }
  36. @Bean
  37. public KieFileSystem getFileSystem() {
  38. KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
  39. return kieFileSystem;
  40. }
  41. public Environment getEnv() {
  42. Environment env = kieServices.newEnvironment();
  43. env.set(EnvironmentName.ENTITY_MANAGER_FACTORY, Persistence.createEntityManagerFactory(&quot;org.drools.persistence.jpa&quot;));
  44. env.set(EnvironmentName.TRANSACTION_MANAGER, TransactionManagerServices.getTransactionManager());
  45. return env;
  46. }
  47. private void initDataSource() {
  48. PoolingDataSource ds = new PoolingDataSource();
  49. ds.setUniqueName(&quot;jdbc/BitronixJTADataSource&quot;);
  50. ds.setClassName(&quot;com.mysql.cj.jdbc.MysqlXADataSource&quot;);
  51. ds.setMaxPoolSize(3);
  52. ds.setAllowLocalTransactions(true);
  53. ds.getDriverProperties().put(&quot;user&quot;, &quot;root&quot;);
  54. ds.getDriverProperties().put(&quot;password&quot;, &quot;1234&quot;);
  55. ds.getDriverProperties().put(&quot;URL&quot;, &quot;jdbc:mysql://localhost:3306/drool_demo&quot;);
  56. ds.init();
  57. }
  58. private KieSession newSession() {
  59. return kieServices.getStoreServices().newKieSession(getKieContainer().getKieBase(), null, getEnv());
  60. }
  61. private KieSession persistedSession(SessioninfoEntity sessioninfoEntity) {
  62. return kieServices.getStoreServices().loadKieSession(sessioninfoEntity.getId(), getKieContainer().getKieBase(), null, getEnv());
  63. }
  64. }

Container releaseId updation method:

  1. @Service
  2. public class DroolsUtilityImpl implements IDroolsUtility {
  3. @Autowired
  4. private KieFileSystem fileSystem;
  5. @Autowired
  6. private KieServices services;
  7. @Autowired
  8. private KieContainer container;
  9. @Override
  10. public void updateContainer(String rules) {
  11. // System.out.println(&quot;drl:\n&quot; + rules);
  12. fileSystem.write(&quot;src/main/resources/rules/rule.drl&quot;, rules);
  13. KieBuilder kb = services.newKieBuilder(fileSystem).buildAll();
  14. KieModule kieModule = kb.getKieModule();
  15. container.updateToVersion(kieModule.getReleaseId());
  16. }
  17. @Override
  18. public void viewContainerRules() {
  19. KieBase kieBase = container.getKieBase();
  20. for (KiePackage kp : kieBase.getKiePackages()) {
  21. for (Rule rule : kp.getRules()) {
  22. System.out.println(rule.getName());
  23. }
  24. }
  25. }
  26. }

答案1

得分: 1

我会尝试重新生成pom并增加发布编号。有点类似于这个例子:

  1. KieServices ks = KieServices.Factory.get();
  2. ReleaseId releaseId = ks.newReleaseId("org.kie", "hello-world", "1.0");
  3. KieFileSystem kfs = ks.newKieFileSystem()
  4. .generateAndWritePomXML(releaseId)
  5. .write("src/main/resources/KBase1/org/pkg1/r1.drl", createDrl("R1"))
  6. .write("src/main/resources/KBase1/org/pkg2/r2.drl", createDrl("R2"))
  7. .writeKModuleXML(createKieProjectWithPackages(ks, "org.pkg1").toXML());
  8. ks.newKieBuilder(kfs).buildAll();

摘自:
https://www.codota.com/web/assistant/code/rs/5c65b1cf1095a5000171b19f#L199

英文:

I would try to regenerate the pom and increase release Id. A bit like in this example :

  1. KieServices ks = KieServices.Factory.get();
  2. ReleaseId releaseId = ks.newReleaseId(&quot;org.kie&quot;, &quot;hello-world&quot;, &quot;1.0&quot;);
  3. KieFileSystem kfs = ks.newKieFileSystem()
  4. .generateAndWritePomXML( releaseId )
  5. .write( &quot;src/main/resources/KBase1/org/pkg1/r1.drl&quot;, createDrl( &quot;R1&quot; ) )
  6. .write( &quot;src/main/resources/KBase1/org/pkg2/r2.drl&quot;, createDrl( &quot;R2&quot; ) )
  7. .writeKModuleXML( createKieProjectWithPackages( ks, &quot;org.pkg1&quot; ).toXML() );
  8. ks.newKieBuilder( kfs ).buildAll();

taken from
https://www.codota.com/web/assistant/code/rs/5c65b1cf1095a5000171b19f#L199

huangapple
  • 本文由 发表于 2020年10月21日 01:57:50
  • 转载请务必保留本文链接:https://go.coder-hub.com/64450848.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定