[英]getFactHandle method returns null for any fact in Drools
我有以下代码:
KieSession kSession = JPAKnowledgeService.loadStatefulKnowledgeSession(someId, kieBase, null, env)
for (FactHandle f : kSession.getFactHandles()) {
Object sessionObject = kSession.getObject(f);
logger.info(String.format("Fact: %s", sessionObject.toString()));
}
kSession.insert(someFact);
// Let's loop again to see if our fact is indeed there
for (FactHandle f : kSession.getFactHandles()) {
Object sessionObject = kSession.getObject(f);
logger.info(String.format("Fact: %s", sessionObject.toString()));
}
// Do something else with someFact, insert it into some db
// factHandle is null
FactHandle factHandle = kSession.getFactHandle(someFact);
基本上,我正在加载我的持久性KieSession
,向其中添加一个事实,遍历事实以检查新添加的事实确实存在,但是当我尝试取回它时, factHandle
对象为null。 我正在尝试将Drools与基于身份的声明模式一起使用。 所以我的相关问题是:
someFact
在内存中的位置可能已更改。 Do something else with someFact, insert it into some db
阶段,是否会对问题产生影响? someFact
对象上归档了一个private long id
,用@Id
注释。 KieBase
如下方式创建我的KieContainer
和KieBase
: ```
@Bean
public KieServices kieServices() {
return KieServices.Factory.get();
}
@Bean
public KieContainer kieContainer() throws IOException {
final KieRepository kieRepository = kieServices().getRepository();
kieRepository.addKieModule(new KieModule() {
@Override
public ReleaseId getReleaseId() {
return kieRepository.getDefaultReleaseId();
}
});
KieFileSystem kfs = kieServices().newKieFileSystem();
PathMatchingResourcePatternResolver pmrs = new PathMatchingResourcePatternResolver();
Resource[] files = pmrs.getResources("classpath*:com/company/**/rules/*.drl");
for(Resource file : files) {
String myString = IOUtils.toString(file.getInputStream(), "UTF-8");
kfs.write("src/main/resources/"+ file.getFilename(), myString);
}
KieBuilder kieBuilder = kieServices().newKieBuilder(kfs);
kieBuilder.buildAll();
return kieServices().newKieContainer(kieRepository.getDefaultReleaseId());
}
@Bean
public KieBase kieBase() throws IOException {
KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration();
kieBaseConfiguration.setProperty("assertBehaviour", "equality");
return KnowledgeBaseFactory.newKnowledgeBase(kieBaseConfiguration);
}
```
如果我要切换到基于平等的主张,我已经实现了equals
和hashCode
我对象的方法,但无法找到一个方法来定义我的KieBase
的说法是EQUALITY
。 我怎样才能做到这一点?
someFact
中Do something else with someFact, insert it into some db
,即可更改someFact
在内存中的位置, someFact
生效,因此Drools无法使用身份模式进行比较。 @Id
批注。 以下是将引擎置于相等模式的方式:
KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration(); kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY); return kieContainer().newKieBase(kieBaseConfiguration);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.