Drools 为了对非开发人员更加友好,提供了dsl语言的支持,通过dsl再转换成drl文件来进行执行。

DSL简介

DSL == Domain Specific Language
以贴近业务领域的方式,即以类自然语言的方式来构造软件,使得我们不用花费太多精力就能看懂代码所对应的业务含义 。
它是创建规则语言的一种方式,致力于解决我们的问题域 。
DSL相当于一个转换器,它能将某一领域内的术语转换成规则语言。

Drools DSL背后的概念很简单。创建一个包含面向业务的概念的字典文件,并将其翻译成DRL。

定义DSL文件

基本内容格式如下:

[when] There is a person = $p:Person()

[when]

– id greater than {id:\d*} = id > {id}

[then]

print = System.out.println(“I am fired!”)

上面就是一个简单的dsl文件的定义,它遵从如下语法格式:

[<scope>][<type definition>]<dsl expression>=<replacement text>
其中

[when]

or [condition] 定义的语法应用于LHS

[then]

or [consequence] 定义的语法应用于RHS [*] 以上两者都适用

[keyword]

关键字,比如no-loop这一类属性

使用DSL文件

新建dslr后缀的文件,里面的语法为:

rule 'test-dsl'

when
    There is a person
    - id greater than 10
then
    print
end

执行dsl文件的转换

public class Demo14 extends BaseDemo {

    public static void main(String[] args) throws IOException, DroolsParserException {

        String dslContent = "[when] There is a person = $p:Person()\n" +
                "[when] - id greater than {id:\\d*} = id > {id}\n" +
                "[then] print = System.out.println(\"I am fired!\")";

        String dslrContent = "rule 'test-dsl'\n" +
                "\n" +
                "when\n" +
                "    There is a person\n" +
                "    - id greater than 10\n" +
                "then\n" +
                "    print\n" +
                "end";

        DefaultExpanderResolver resolver = new DefaultExpanderResolver(new StringReader(dslContent));

        DrlParser parser = new DrlParser();

        String string = parser.getExpandedDRL(dslrContent,resolver);

        System.out.println(string);

    }
}

打印出的结果为:

rule 'test-dsl'

when
    $p:Person(id > 10)
then
    System.out.println("I am fired!")
end

就是正常写的drl文件的内容。

拓展

当然,也可以直接在dsls中通过expander来引入规则到dslr中,比如:

rule 'test-dsl'
expander demo.dsl
when
    There is a person
    - id greater than 10
then
    print
end

然后通过kmodule.xml中像常规drl文件使用一样来使用dslr文件。

Drools技术视频

CSDN学院:《Drools7规则引擎进阶教程》

CSDN学院:《Drools7规则引擎入门教程》

CSDN学院:《Drools7系列优惠套餐》



Drools使用dsl语言插图

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://choupangxia.com/2019/07/06/drools%e4%bd%bf%e7%94%a8dsl%e8%af%ad%e8%a8%80/