Метод getFactHandle возвращает null для любого факта в 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 с режимом подтверждения личности. Итак, мои связанные вопросы:

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


person Hasan Can Saral    schedule 16.02.2017    source источник


Ответы (1)


  1. Просто расположение someFact в памяти, измененное в Do something else with someFact, insert it into some db, имеет эффект, поэтому Drools не может сравнивать в режиме идентификации.
  2. Место в памяти. Не аннотация Javax @Id.
  3. Вот как вы переводите движок в режим равенства:

    KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration();
        kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY);
        return kieContainer().newKieBase(kieBaseConfiguration);
    
person Hasan Can Saral    schedule 20.02.2017