对规则处理的事实进行排序

时间:2017-04-27 18:44:24

标签: drools drools-fusion

我们有一个场景,需要按插入顺序或与事实相关的日期处理事实。确切地说,我需要添加事务直到总和达到阈值。达到阈值的那一刻,我需要忽略其余的交易。因此,按时间交易的顺序很重要。 以下是我正在使用的示例代码:

declare HasTransactionDetails
    @role(event)
    @expires(1d)
    @timestamp (txnDate)
end

dialect "mvel" 

rule "Max per day"
    agenda-group "evaluate"
    no-loop true
    lock-on-active true
    when
        tp : TransactionProfile(maxAmount != null,
                maxAmountPeriod.value == "Day")
        tr : HasTransactionDetails() from entry-point "transactionEntry"
        helper : ProfileTransactionMatchHelper(profileId == tp.id, txnId == tr.txnId)
then
...
...

我调用它的方式:

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
KieBaseConfiguration kieConfiguration = KieServices.Factory.get().newKieBaseConfiguration();
kieConfiguration.setOption(EventProcessingOption.STREAM);
KieServices ks = KieServices.Factory.get();
KieContainer kContainer = ks.getKieClasspathContainer();
KnowledgeBase kieBase = KnowledgeBaseFactory.newKnowledgeBase(kieConfiguration);

kieBase.addKnowledgePackages(kbuilder.getKnowledgePackages());
KieSessionConfiguration sessionConfiguration = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
sessionConfiguration.setOption(ClockTypeOption.get("realtime"));

KieSession session = kContainer.newKieSession("TransactionSession", sessionConfiguration);
EntryPoint entry = session.getEntryPoint("transactionEntry");
for (Object fact : facts) {
  if (fact instanceof HasTransactionDetails) {
    entry.insert(fact);
  }
  session.insert(fact);
}
  session.fireAllRules();

所以,我已经将模式设置为STREAM,定义了一个流' transactionEntry',将所有事务事实添加到此流中,并将其余事实添加到会话中,标记事务事实的时间戳,并触发规则到底。 我的期望是所有的交易事实都将按照“txnDate”的顺序进行处理。在交易事实上指定,但订单总是随机的。

我确实读过这个example,以确保按顺序处理事实,在会话中添加事实后触发规则,这是针对每个事实完成的。这对我来说没有意义。 如果我的期望错误或我错过了任何一步,有人可以指导我吗?

1 个答案:

答案 0 :(得分:0)

每次插入(HasTransactionDetails对象)后调用fireAllRules

for (Object fact : facts) {
  if (fact instanceof HasTransactionDetails) {
    entry.insert(fact);
    session.fireAllRules();   // here or ...
  } else {
    session.insert(fact);
  }
  session.fireAllRules();     // here
}