如何解决通过保留现有规则向单例KieContainer添加新规则
我试图在Spring Boot项目中向具有会话持久性的单身KieContainer添加新规则。我已经实现了将新规则添加到KieContainer的程序化方法,但是每次更新KieContainer的ReleaseID时,现有规则都会被替换。我想要的是保留Drools会话中存在的现有规则,并向其中添加新规则。我的实用工具类中的updateContainer()函数是我对KieContainer进行更改的方式。任何建议都欢迎。我的实现如下:
配置类:
@Configuration
public class DynamicDroolsConfig {
private KieServices kieServices;
@Autowired
private IPersistentSessionService iPersistentSessionService;
@postconstruct
private void init() {
this.initDataSource();
this.kieServices = KieServices.Factory.get();
}
@Bean
public KieSession getPersistentKieSession() {
List<SessioninfoEntity> sessioninfoEntities = iPersistentSessionService.getStoredSessionDetails();
if (sessioninfoEntities.size() == 0) {
return newSession();
} else if (sessioninfoEntities.size() == 1) {
return persistedSession(sessioninfoEntities.get(0));
} else {
// todo other things
return null;
}
}
@Bean
public KieServices getKieServices() {
return this.kieServices;
}
@Bean
public KieContainer getKieContainer() {
getFileSystem();
KieRepository kieRepository = kieServices.getRepository();
kieRepository.addKieModule(kieRepository::getDefaultReleaseId);
KieBuilder kb = kieServices.newKieBuilder(getFileSystem()).buildAll();
KieModule kieModule = kb.getKieModule();
return kieServices.newKieContainer(kieModule.getReleaseId());
}
@Bean
public KieFileSystem getFileSystem() {
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
return kieFileSystem;
}
public Environment getEnv() {
Environment env = kieServices.newenvironment();
env.set(EnvironmentName.ENTITY_MANAGER_FACTORY,Persistence.createEntityManagerFactory("org.drools.persistence.jpa"));
env.set(EnvironmentName.TRANSACTION_MANAGER,TransactionManagerServices.getTransactionManager());
return env;
}
private void initDataSource() {
PoolingDataSource ds = new PoolingDataSource();
ds.setUniqueName("jdbc/BitronixJTADataSource");
ds.setClassName("com.MysqL.cj.jdbc.MysqLXADataSource");
ds.setMaxPoolSize(3);
ds.setAllowLocalTransactions(true);
ds.getDriverProperties().put("user","root");
ds.getDriverProperties().put("password","1234");
ds.getDriverProperties().put("URL","jdbc:MysqL://localhost:3306/drool_demo");
ds.init();
}
private KieSession newSession() {
return kieServices.getStoreServices().newKieSession(getKieContainer().getKieBase(),null,getEnv());
}
private KieSession persistedSession(SessioninfoEntity sessioninfoEntity) {
return kieServices.getStoreServices().loadKieSession(sessioninfoEntity.getId(),getKieContainer().getKieBase(),getEnv());
}
}
容器releaseId更新方法:
@Service
public class DroolsUtilityImpl implements IDroolsUtility {
@Autowired
private KieFileSystem fileSystem;
@Autowired
private KieServices services;
@Autowired
private KieContainer container;
@Override
public void updateContainer(String rules) {
// System.out.println("drl:\n" + rules);
fileSystem.write("src/main/resources/rules/rule.drl",rules);
KieBuilder kb = services.newKieBuilder(fileSystem).buildAll();
KieModule kieModule = kb.getKieModule();
container.updatetoVersion(kieModule.getReleaseId());
}
@Override
public void viewContainerRules() {
KieBase kieBase = container.getKieBase();
for (KiePackage kp : kieBase.getKiePackages()) {
for (Rule rule : kp.getRules()) {
System.out.println(rule.getName());
}
}
}
}
解决方法
我将尝试重新生成pom并增加发布ID。有点像这个例子:
KieServices ks = KieServices.Factory.get();
ReleaseId releaseId = ks.newReleaseId("org.kie","hello-world","1.0");
KieFileSystem kfs = ks.newKieFileSystem()
.generateAndWritePomXML( releaseId )
.write( "src/main/resources/KBase1/org/pkg1/r1.drl",createDrl( "R1" ) )
.write( "src/main/resources/KBase1/org/pkg2/r2.drl",createDrl( "R2" ) )
.writeKModuleXML( createKieProjectWithPackages( ks,"org.pkg1" ).toXML() );
ks.newKieBuilder( kfs ).buildAll();
取自 https://www.codota.com/web/assistant/code/rs/5c65b1cf1095a5000171b19f#L199
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。