繁体   English   中英

对于Drools中的任何事实,getFactHandle方法返回null

[英]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与基于身份的声明模式一起使用。 所以我的相关问题是:

  1. 为什么我的事实句柄为空? someFact在内存中的位置可能已更改。 Do something else with someFact, insert it into some db阶段,是否会对问题产生影响?
  2. Drools如何比较身份? 我在someFact对象上归档了一个private long id ,用@Id注释。
  3. KieBase如下方式创建我的KieContainerKieBase

```

@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);
}

```

如果我要切换到基于平等的主张,我已经实现了equalshashCode我对象的方法,但无法找到一个方法来定义我的KieBase的说法是EQUALITY 我怎样才能做到这一点?

  1. 只需在someFactDo something else with someFact, insert it into some db ,即可更改someFact在内存中的位置, someFact生效,因此Drools无法使用身份模式进行比较。
  2. 内存中的位置。 不是Javax @Id批注。
  3. 以下是将引擎置于相等模式的方式:

     KieBaseConfiguration kieBaseConfiguration = kieServices().newKieBaseConfiguration(); kieBaseConfiguration.setOption(EqualityBehaviorOption.EQUALITY); return kieContainer().newKieBase(kieBaseConfiguration); 

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM