getFactHandle 方法 returns null 对于 Drools 中的任何事实
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
对象为空。我正在尝试将 Drools 与基于身份的断言模式结合使用。所以我的相关问题是:
- 为什么我的事实句柄为空?
someFact
在内存中的位置可能在 Do something else with someFact, insert it into some db
阶段发生了变化,对问题有影响吗?
- Drools 如何比较身份?我在我的
someFact
对象上有一个 private long id
归档,用 @Id
. 注释
- 我正在创建
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
中发生了变化,因此 Drools 无法使用身份模式进行比较。
- 内存中的位置。不是 Javax
@Id
注释。
以下是将引擎置于相等模式的方法:
KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration();
kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY);
return kieContainer().newKieBase(kieBaseConfiguration);
我有如下一段代码:
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
对象为空。我正在尝试将 Drools 与基于身份的断言模式结合使用。所以我的相关问题是:
- 为什么我的事实句柄为空?
someFact
在内存中的位置可能在Do something else with someFact, insert it into some db
阶段发生了变化,对问题有影响吗? - Drools 如何比较身份?我在我的
someFact
对象上有一个private long id
归档,用@Id
. 注释
- 我正在创建
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
中发生了变化,因此 Drools 无法使用身份模式进行比较。 - 内存中的位置。不是 Javax
@Id
注释。 以下是将引擎置于相等模式的方法:
KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration(); kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY); return kieContainer().newKieBase(kieBaseConfiguration);