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
}