当前位置: 首页 > 知识库问答 >
问题:

如何维护Drools事实全局计数器并根据其值应用规则

宫弘亮
2023-03-14

我对Drools是一个新手,我将在一个需求中获得一批事实(银行账户信息)。当连续三个小账户(年龄

以下规则未触发

 rule checkCounterAndProduceAlert when
       b: ResultFact( value > 2 )   
    then
        System.out.println("Alert****");  
    end

Here is the DRL full content of DRL file




        package com.ys.drools.rules

import com.ys.drools.facts.*;

rule checkCounterAndProduceAlert 

no-loop true
when
   b: ResultFact( value > 2 )   
then
    System.out.println("Alert****");  
end


rule checkSeriesOfMinorAccount when
    a : AccountHolder( age < 16 )
    b : ResultFact()
then
b.inc();
update(b);

System.out.println("Incrementing count  since minor account appered");
System.out.println("***********************************************");
System.out.println(b.getValue());
end


rule checMajorAccount when
    a : AccountHolder( age >16 )
    b :ResultFact()
then
b.reset();
update(b);
System.out.println("Making count zero since major account appered");
System.out.println(b.getValue());
end

下面是Java类,它将加载3个次要帐户并测试应用程序

package com.ys.drools.data.loader;

import java.util.ArrayList;
import java.util.List;

import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import com.ys.drools.facts.AccountHolder;
import com.ys.drools.util.BankAccountUtilService;
import com.ys.drools.util.DroolsGlobalUtil;

public class Test {
    private BankAccountUtilService service;
    private  KieContainer kieContainer;
    private KieSession kieSession;
    private static Logger log = LoggerFactory
            .getLogger(Test.class);

    private List<AccountHolder> accountHolders=new ArrayList<AccountHolder>();  

    public Test(){
        kieContainer= KieServices.Factory.get().getKieClasspathContainer();     
          kieSession = kieContainer.newKieSession("BankAccountSession");
    }

    public static void main(String[] args) {
        // TODO Auto-generated method stub

        Test test=new Test();
        List<AccountHolder> aList=test.fillAccountHolderList();
         ResultFact fact=new ResultFact();
       test.kieSession.insert(fact);
       for(int i=0;i<aList.size();i++){
        test.kieSession.insert(aList.get(i));
        test.kieSession.fireAllRules();
        }

      }


    public List<AccountHolder> fillAccountHolderList(){
         List<AccountHolder> accountHolders=new ArrayList<AccountHolder>(); 
         AccountHolder a1=new AccountHolder("Karun", 12);
         AccountHolder a2=new AccountHolder("kumar", 12);
         AccountHolder a3=new AccountHolder("rakesh", 10);
         accountHolders.add(a1);
         accountHolders.add(a2);
         accountHolders.add(a3);
         return accountHolders; 
    }
}

请提供解决方案。运行测试类时的输出

Incrementing count  since minor account appered
***********************************************
1
Incrementing count  since minor account appered
***********************************************
2
Incrementing count  since minor account appered
***********************************************
3
Making count zero since major account appered
0

即使在值为之后(“警报****”)也不会显示

共有1个答案

孟树
2023-03-14

解决方案很简单。

class Counter {
    private int value;
    public void inc(){ value++; }
    public void reset(){ value = 0; }
    public int getValue(){ return value; }
}

将计数器事实插入工作内存,并在规则中添加一个$c:Counter()模式后,在适当的情况下使用方法inc和reset。

rule checkCounterAndProduceAlert when
    Counter( value == 3 )   
then
    System.out.println("Alert****");  
end

您可能需要说明是否应在连续未成年人的第六、第九、...帐户之后发出另一个警报。

编辑

您还可以在DRL文件中声明并插入:

declare Counter
  value : int
end

rule "insert counter"
  salience 999999
when
  not Counter()
then
  insert( new Counter() );
end
 类似资料:
  • 我对口水很陌生,从基础开始。这是一个设置; > 有一些规则文件 不同文件中的规则属于不同的议程组 所有规则都基于同一事实 在我的单元测试中,我获得了一个特定的“议程组”,设置焦点(

  • 我对drools和KIE服务器是新手。我遇到了一个问题,即如何通过触发规则RHS(then action)在工作记忆中插入新的事实,然后通过这些动态插入的事实激活其他规则。 我所期望的是,当BaseFeature从外部插入工作内存并激活RuleOne时,在RuleOne内部“然后”它将插入新的事实RuleResult,并希望激活RuleTwo,但它没有激活RuleTwo,只是RuleOne被激活了

  • 我对商业规则的世界还很陌生,但我想我已经理解了Drools Expert和Drools Guvnor的概念,但我仍然有点困惑,与Expert相比,到底是如何/何时/为什么使用Guvnor的。而且,无论他们是相互排斥,还是有能力,甚至更愿意并肩工作。下面是一些让我感到困惑的突出主题,以及我关注的问题背后的一些解释,主要集中在应用程序的可维护性上。 Guvnor是否具有Expert plus more

  • 我正在做一个我想在firebase实时数据库上运行的项目。我用以下格式创建了一个数据库设置: 我的安全规则如下所示: 我试图存档,每个人都可以阅读“马”、“图像”和“视频”中的详细信息,但只有经过身份验证的用户才能在“马”、“图像”和“视频”中添加自己的条目(由firebase auth提供的用户ID检查)。 我的第一个问题是:我应该把“图像”和“视频”作为“马”的子对象吗?如果我能为马写一条读写

  • 我对口水有点陌生,我想在一个项目中了解更多,所以我在eclipse上用口水做了一个简单的程序。工作流程非常简单,我有一个珠宝产品模型,对于每件珠宝,我根据名称申请一个折扣。 这很好,但我确实希望看到事实列表,以及每个触发规则使用的事实。我有这个: 规则。日间行车灯 型号。Product.java 主要的DroolsTest。Java语言 输出: 我想要这样的东西: 有可能吗?我检查了Working

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例