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文件。