我们有一个场景,需要按插入顺序或与事实相关的日期处理事实。确切地说,我需要添加事务直到总和达到阈值。达到阈值的那一刻,我需要忽略其余的交易。因此,按时间交易的顺序很重要。 以下是我正在使用的示例代码:
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,以确保按顺序处理事实,在会话中添加事实后触发规则,这是针对每个事实完成的。这对我来说没有意义。 如果我的期望错误或我错过了任何一步,有人可以指导我吗?
答案 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
}