zoukankan      html  css  js  c++  java
  • 规则引擎的应用

    java开源的规则引擎有:Drools、Easy Rules、Mandarax、IBM ILOG。使用最为广泛并且开源的是Drools。

           规则引擎的优点

      • 声明式编程
        规则可以很容易地解决困难的问题,并得到解决方案的验证。与代码不同,规则以较不复杂的语言编写; 业务分析师可以轻松阅读和验证一套规则。

      • 逻辑和数据分离
        数据位于“域对象”中,业务逻辑位于“规则”中。根据项目的种类,这种分离是非常有利的。

      • 速度和可扩展性
        写入Drools的Rete OO算法已经是一个成熟的算法。在Drools的帮助下,您的应用程序变得非常可扩展。如果频繁更改请求,可以添加新规则,而无需修改现有规则。

      • 知识集中化
        通过使用规则,您创建一个可执行的知识库(知识库)。这是商业政策的一个真理点。理想情况下,规则是可读的,它们也可以用作文档。

        Drools 介绍

        Drools 是一个基于Charles Forgy’s的RETE算法的,易于访问企业策略、易于调整以及易于管理的开源业务规则引擎,符合业内标准,速度快、效率高。 业务分析师人员或审核人员可以利用它轻松查看业务规则,从而检验是否已编码的规则执行了所需的业务规则。

        Drools 是用Java语言编写的开放源码规则引擎,使用Rete算法对所编写的规则求值。Drools允许使用声明方式表达业务逻辑。可以使用非XML的本地语言编写规则,从而便于学习和理解。并且,还可以将Java代码直接嵌入到规则文件中,这令Drools的学习更加吸引人。

        Drools优点:

        • 非常活跃的社区支持
        • 易用
        • 快速的执行速度
        • 在 Java 开发人员中流行
        • 与 Java Rule Engine API(JSR 94)兼容

        Drools相关概念:

        • 事实(Fact):对象之间及对象属性之间的关系
        • 规则(rule):是由条件和结论构成的推理语句,一般表示为if…Then。一个规则的if部分称为LHS,then部分称为RHS。
        • 模式(module):就是指IF语句的条件。这里IF条件可能是有几个更小的条件组成的大条件。模式就是指的不能在继续分割下去的最小的原子条件。

        Drools通过 事实、规则和模式相互组合来完成工作,drools在开源规则引擎中使用率最广,但是在国内企业使用偏少,保险、支付行业使用稍多。

        简易实例代码:

        drools有专门的规则语法drl,就是专门描述具体业务的规则是如何执行的:

        package com.zhaozhi.spider.service.drools;
        rule "Drools Introduction"
        when
        $droolsIntro : DroolsIntroduction( topic == "Drools" )
        then
        System.out.println($droolsIntro.introduceYourself());
        end

        xml配置:

        <?xml version="1.0" encoding="UTF-8"?>
        <kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
            <kbase name="rules" packages="rules">
                <ksession name="ksession-rules"/>
            </kbase>
        </kmodule>

        相关类与测试:

        public class DroolsIntroduction {
            private String topic;
        
            public DroolsIntroduction(String topic) {
                this.topic = topic;
            }
        
            public String getTopic() {
                return topic;
            }
        
            public String introduceYourself() {
                return "Drools 6.2.0.Final";
            }
        
        }
        
        public class DroolsRules {
        
            public static void fireAllRules(List<Object> rules){
                try {
                    KieServices ks = KieServices.Factory.get();
                    KieContainer kContainer = ks.getKieClasspathContainer();
                    KieSession kSession = kContainer.newKieSession("ksession-rules");
                    for(Object rule:rules){
                        if(rule!=null){
                            kSession.insert(rule);
                        }
                    }
                    kSession.fireAllRules();
                } catch (Throwable t) {
                    t.printStackTrace();
                }
            
            }
        }
        
        public class DroolsTest {
            
            
            @Before
            public void setUp() throws IOException {
                
            }
            
            @Test
            public void test(){
                List<Object> rules = Lists.newArrayList();
                rules.add(new DroolsIntroduction("hello"));
                rules.add(new DroolsIntroduction("Drools"));
                DroolsRules.fireAllRules(rules);
            }
            
            
            
        }

         maven依赖:

        <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
            xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
            <modelVersion>4.0.0</modelVersion>
            <groupId>com.javacodegeeks.drools</groupId>
            <artifactId>droolsHelloWorld</artifactId>
            <version>0.0.1-SNAPSHOT</version>
        
            <dependencies>
                <dependency>
                    <groupId>org.drools</groupId>
                    <artifactId>drools-compiler</artifactId>
                    <version>${drools.version}</version>
                </dependency>        
            </dependencies>
            <properties>
                <drools.version>6.2.0.Final</drools.version>
                <jbpm.version>6.2.0.Final</jbpm.version>
            </properties>
        </project>
  • 相关阅读:
    求随机数平均值方法 求随机数方差方法 求正态分布的随机数
    combox 绑定
    winform界面textbox框 鼠标经过时出现浮动
    Regex
    C# 3.0 一行求方差
    通过Linq 实现DataTable Group By
    ORACLE 时间运算
    发布几个国外的XHTML模板站,DIV+CSS模板下载
    C# 3.0新特性系列:隐含类型var
    在NTier 或多层应用程序中使用ADO.NET Entity Framework
  • 原文地址:https://www.cnblogs.com/yzf666/p/7717259.html
Copyright © 2011-2022 走看看