У меня есть следующий фрагмент кода:
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 с режимом подтверждения личности. Итак, мои связанные вопросы:
- Почему мой обработчик фактов имеет значение null? Расположение
someFact
в памяти могло измениться на этапеDo something else with someFact, insert it into some db
, повлияет ли это на проблему? - Как Drools сравнивает личности? У меня есть файл
private long id
для моего объектаsomeFact
с аннотацией@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
. Как я могу это сделать?