drools语言的在java代码中的执行过程,并附上drools的执行测试小demo---仅自己的理解

首先解释一下什么是drools语言:

  · Drools是一个基于Java的规则引擎,它允许开发人员定义业务规则并将其与应用程序集成。Drools使用DRL(Drools Rule Language)语言来定义规则,这是一种基于规则的语言,类似于SQL。DRL语言允许开发人员定义规则,包括条件和操作,以及规则之间的关系。Drools还提供了一些高级功能,如模式匹配、逻辑操作符、函数和变量等,使得规则定义更加灵活和强大。Drools还提供了一个基于Web的规则编辑器,使得规则的编辑和管理更加方便。Drools可以与Java应用程序集成,也可以与其他语言和平台集成,如.NET、Python、Ruby等。Drools的应用场景包括金融、医疗、电信、物流等领域,可以帮助企业实现自动化决策和业务流程优化。

 导入drools核心依赖:


            org.drools
            drools-compiler
            7.10.0.Final
        
        
            org.kie
            kie-api
            7.10.0.Final
        
        

java实体类

package com.drools.entity;

public class Order {

    private Double originalPrice;//订单原始价格,即优惠前价格
    private Double realPrice;//订单真实价格,即优惠后价格

    public Double getOriginalPrice() {
        return originalPrice;
    }

    public void setOriginalPrice(Double originalPrice) {
        this.originalPrice = originalPrice;
    }

    public Double getRealPrice() {
        return realPrice;
    }

    public void setRealPrice(Double realPrice) {
        this.realPrice = realPrice;
    }

    public String toString() {
        return "Order{" +
                "originalPrice=" + originalPrice +
                ", realPrice=" + realPrice +
                '}';
    }

}

drools语言在java中以.drl文件的形式存在,下面是一个关于图书优惠的规则文件

bookDiscount.drl文件

//图书优惠规则
package book.discount
import com.drools.entity.Order

//规则一:所购图书总价在100元以下的没有优惠
rule "book_discount_1"
    when
        $order:Order(originalPrice < 100)
    then
        $order.setRealPrice($order.getOriginalPrice());
        System.out.println("成功匹配到规则一:所购图书总价在100元以下的没有优惠");
end

//规则二:所购图书总价在100到200元的优惠20元
rule "book_discount_2"
    when
        $order:Order(originalPrice < 200 && originalPrice >= 100)
    then
        $order.setRealPrice($order.getOriginalPrice() - 20);
        System.out.println("成功匹配到规则二:所购图书总价在100到200元的优惠20元");
end

//规则三:所购图书总价在200到300元的优惠50元
rule "book_discount_3"
    when
        $order:Order(originalPrice <= 300 && originalPrice >= 200)
    then
        $order.setRealPrice($order.getOriginalPrice() - 50);
        System.out.println("成功匹配到规则三:所购图书总价在200到300元的优惠50元");
end

//规则四:所购图书总价在300元以上的优惠100元
rule "book_discount_4"
    when
        $order:Order(originalPrice >= 300)
    then
        $order.setRealPrice($order.getOriginalPrice() - 100);
        System.out.println("成功匹配到规则四:所购图书总价在300元以上的优惠100元");
end

编写测试类:
 

@Test
    public void test(){

        //把drools脚本文件转化成一个String字符串
        String drl = "//图书优惠规则\n" +
                "package book.discount\n" +
                "import com.drools.entity.Order\n" +
                "\n" +
                "//规则一:所购图书总价在100元以下的没有优惠\n" +
                "rule \"book_discount_1\"\n" +
                "    when\n" +
                "        $order:Order(originalPrice < 100)\n" +
                "    then\n" +
                "        $order.setRealPrice($order.getOriginalPrice());\n" +
                "        System.out.println(\"成功匹配到规则一:所购图书总价在100元以下的没有优惠\");\n" +
                "end\n" +
                "\n" +
                "//规则二:所购图书总价在100到200元的优惠20元\n" +
                "rule \"book_discount_2\"\n" +
                "    when\n" +
                "        $order:Order(originalPrice < 200 && originalPrice >= 100)\n" +
                "    then\n" +
                "        $order.setRealPrice($order.getOriginalPrice() - 20);\n" +
                "        System.out.println(\"成功匹配到规则二:所购图书总价在100到200元的优惠20元\");\n" +
                "end\n" +
                "\n" +
                "//规则三:所购图书总价在200到300元的优惠50元\n" +
                "rule \"book_discount_3\"\n" +
                "    when\n" +
                "        $order:Order(originalPrice <= 300 && originalPrice >= 200)\n" +
                "    then\n" +
                "        $order.setRealPrice($order.getOriginalPrice() - 50);\n" +
                "        System.out.println(\"成功匹配到规则三:所购图书总价在200到300元的优惠50元\");\n" +
                "end\n" +
                "\n" +
                "//规则四:所购图书总价在300元以上的优惠100元\n" +
                "rule \"book_discount_4\"\n" +
                "    when\n" +
                "        $order:Order(originalPrice >= 300)\n" +
                "    then\n" +
                "        $order.setRealPrice($order.getOriginalPrice() - 100);\n" +
                "        System.out.println(\"成功匹配到规则四:所购图书总价在300元以上的优惠100元\");\n" +
                "end\n";
        KieBase kieBase = createKieBase(Lists.newArrayList(drl));
        KieSession kieSession = kieBase.newKieSession();
        Order order = new Order();
        order.setOriginalPrice(180D);
        kieSession.insert(order);
        kieSession.fireAllRules();  //规则执行的核心方法
        kieSession.dispose();
        System.out.println("优惠前原始价格:" + order.getOriginalPrice() +
                ",优惠后价格:" + order.getRealPrice());

    }

    //生成规则之行的KieBase---就是把drools语言放到KieBase容器中
    private static KieBase createKieBase(List drls) {
        Charset charset = Charset.forName("utf-8");
        KnowledgeBuilderConfiguration builderConfiguration = KnowledgeBuilderFactory.newKnowledgeBuilderConfiguration(null, null);
        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder(builderConfiguration);
        for (String s:drls) {
            kbuilder.add(ResourceFactory.newByteArrayResource(s.getBytes(charset)), ResourceType.DRL);
        }
        KieBaseConfiguration kieBaseConfiguration = KnowledgeBaseFactory.newKnowledgeBaseConfiguration(null, null);
        InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase(kieBaseConfiguration);
        kbase.addPackages(kbuilder.getKnowledgePackages());
        return kbase;
    }

上述demo是以单元测试的形式简单还原了规则执行的规程,让大家有个简单的了解!

你可能感兴趣的:(drools语言,java,脚本语言,java,开发语言)