Drools and Jbpm 学习

进入新公司新项目, 新公司更变态很多网站都没有办法用,youdao note 就是其一。 唯一的好处就是现在上网不需要翻那堵墙, 在看某些技术博客的时候爽些。 闲话少说,目前项目需要用到Drools and JBPM. 所以从现在开始学习Drools and jBPM.

 

   我们在项目里用到的 Drools and jBPM 其实可以分为两部分: Drools Expert 它是一个rule engine, 我们根据Drools 的drl 语法来定义N 多的rules, 然后 这个rule engine 来 驱动这些rules。

 

另外一块就是jBPM 其实它可以看成Workflow , 在项目里面每一个use case 可以看成是我rkflow 的 一个step。最主要的是工作流引擎(在项目中用作Execution Controller ) 来决定下一个step。

 

现在还没有自己的机器,也就没有开发环境,只有纸上谈兵了,到官方网站瞅瞅Drools Expert。从最基本的dlr 语法看起吧, 一个drl 文件由下面部分组成:

 

package package-name

imports

globals

functions

queries

rules


其中每一部分都是optional 的。顺序的话除了package  必须要在第一位, 其它部分都不重要的。

 

1, Rule 。 每一个rule 的组成部分又是:

rule "name"
    attributes
    when
        LHS
    then
        RHS
end

其中LHS 又叫条件, RHS 又叫Action 可以由具体的方言组成的。比如我们的dialect 是Java, 这Action 部分我们就可以写Java语法的语句。

 

2, Drools 5 的关键字 分为 :soft  和 hard  关键字。

 

hard  关键字是保留的, 不能用它们来命名我们自己的domain object 。hard  关键字只有3个:

   true

   false

   null

 

soft 关键字 是在上下文中被识别出来的。 建议是避免混淆不要用它们来命名自己的domain object。 soft 关键字 就比较多聊:

  • lock-on-active

  • date-effective

  • date-expires

  • no-loop

  • auto-focus

  • activation-group

  • agenda-group

  • ruleflow-group

  • entry-point

  • duration

  • package

  • import

  • dialect

  • salience

  • enabled

  • attributes

  • rule

  • extend

  • when

  • then

  • template

  • query

  • declare

  • function

  • global

  • eval

  • not

  • in

  • or

  • and

  • exists

  • forall

  • accumulate

  • collect

  • from

  • action

  • reverse

  • result

  • end

  • over

  • init

3, Drools 的 注释分为 single line (由 # 或 // 开始)和 multi line  (  /*    */ )

 

4, Drools 的 Error message  的 格式 比较严格:

    由左至右分为 5 部分:

1st Block: This area identifies the error code.

2nd Block: Line and column information.

3rd Block: Some text describing the problem.

4th Block: This is the first context. Usually indicates the rule, function, template or query where the error occurred. This block is not mandatory.

5th Block: Identifies the pattern where the error occurred. This block is not mandatory.

 

 

5, Drools 的 function 定义:

  

  function String hello(String name) {
    return "Hello "+name+"!";
   }

 

  function  返回类型   function name  参数 {

    body

  }

 

 定义好了function, 我们可以在其它地方来 import  function . 比如:

   import function my.package.Foo.hello

 

6, 定义新类型

  6.1   Drools  天生支持Java 类型, 我们也可以在Drools 自己来定义新的类型。比如:

   

import java.util.Date

declare Person
    name : String
    dateOfBirth : Date
    address : Address
end

 

 

  一旦定义 我们就可以在rule 中来使用它们:

 

rule "Using a declared Type"
when 
    $p : Person( name == "Bob" )
then
    // Insert Mark, who is Bob's mate.
    Person mark = new Person();
    mark.setName("Mark");
    insert( mark );
end


 

 

7, rule 的 属性: salience 

    这个rule 最重要的属性是用来表示rule 的优先级, 值越大优先级越高。

 

8, Timers and Calendars

    Drools 现在支持基于cron 的 timer

     

timer ( int: <initial delay> <repeat interval>? )
timer ( int: 30s )
timer ( int: 30s 5m )

timer ( cron: <cron expression> )
timer ( cron:* 0/15 * * * ? )

 

9,  Pattern

 Pattern  是最重要的 condition 元素,它用来匹配工作内存中的所有fact。

 

   $pattern Binding :  pattern type ( contraints )

 

rule ...
when
    $p : Person(age < 18)
then
    System.out.println( "Person " + $p );
end

简单的就这么多, 剩下的就是 rule 里面的条件的一些 复杂的用法了。 可以参见 http://docs.jboss.org/drools/release/5.2.0.Final/drools-expert-docs/html/ch05.html#d0e3719

你可能感兴趣的:(drools)