Drools 为规则处理对事实进行排序

Drools 为规则处理对事实进行排序,drools,drools-fusion,Drools,Drools Fusion,我们有一个场景,需要按照插入顺序或按照与事实相关联的日期处理事实。准确地说,我需要添加事务,直到总和达到阈值。一旦达到阈值,我就需要忽略其余的事务。因此,按时间划分的交易顺序很重要。 以下是我正在使用的示例代码: declare HasTransactionDetails @role(event) @expires(1d) @timestamp (txnDate) end dialect "mvel" rule "Max per day" agenda-gr

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

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”顺序进行处理,但顺序始终是随机的

我确实读过这篇文章,为了确保事实按顺序处理,在会话中添加了一个事实之后,规则被触发,这是针对每个事实执行的。这对我来说毫无意义。
如果我的期望是错误的,或者我错过了任何步骤,请有人指导我好吗?

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


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


如果我必须在每次插入事实后触发规则,那么我可以在云模式本身中执行相同的操作,对吗?如何通过流模式利用Drools的时间功能?时间操作符只是带有语法糖的比较操作符。我提出的解决方案的替代方案是可以想象的,尽管它们可能需要更多的努力。为了推荐s.th,人们需要更多地了解场景。否则。用精确的要求更新了我的问题。如果每次插入事实后我都必须触发规则,我可以在云模式下自己做同样的事情,对吗?如何通过流模式利用Drools的时间功能?时间操作符只是带有语法糖的比较操作符。我提出的解决方案的替代方案是可以想象的,尽管它们可能需要更多的努力。为了推荐s.th,人们需要更多地了解场景。否则。用精确的要求更新了我的问题。
for (Object fact : facts) {
  if (fact instanceof HasTransactionDetails) {
    entry.insert(fact);
    session.fireAllRules();   // here or ...
  } else {
    session.insert(fact);
  }
  session.fireAllRules();     // here
}