Drools如何使用规则流bpmn2

最近项目用到了规则流踩了一些小坑,特以记录。
代码写好了再放到规则文件中,规则流最好一步一步画,因为错了就给你抛看不懂没意义的异常。
所有的包包括List这种都得引。
我自己也一知半解,本文都是一些小细节,如有错漏,欢迎指正。
1.文档
官网:https://www.drools.org/
官方文档:https://nheron.gitbooks.io/droolsonboarding/content/gettingStarted/drools.html <-- lesson 4
GitHub:https://github.com/kiegroup/droolscourse
参考了很多人的博客 ,记不全了
https://blog.csdn.net/tian6318/article/details/78569388
https://blog.csdn.net/wo541075754/article/category/6397798
以前规则流是用Drools自己的.rf文件,现在用bpmn2 参考以下回答。
https://stackoverflow.com/questions/16698617/difference-between-rf-and-bpmn2
2.Intellj idea
如果使用Intellj idea来使用drools到没有什么问题,bpmn打开很别扭啊,劝退劝退
(1)官方视频 https://screencast-o-matic.com/watch/cbfFXsX1gX
过程就是安装jboss jpmn
Drools如何使用规则流bpmn2_第1张图片
然后改打开方式
Drools如何使用规则流bpmn2_第2张图片
可是这样 全都堆在一起,看官方视频可能mac支持的好?
Drools如何使用规则流bpmn2_第3张图片
(2)如果用actiBPM ,倒是可以正常用,但是这查看xml和生成png的方式也是绝了。
可以看这个 https://blog.csdn.net/qq_35463719/article/details/82967287
生成png: https://blog.csdn.net/wk52525/article/details/79362904

下面开始正文
一. 安装
可以参考https://blog.csdn.net/shenhaiwen/article/details/70230103
我用的是eclipse mars,安装以下插件
https://download.jboss.org/drools/release/7.5.0.Final/org.drools.updatesite/
Drools如何使用规则流bpmn2_第4张图片
二. 使用
最简单的方式,建一个drool project 选带例子的 先了解一下大概的结构,就是有点旧。
Drools如何使用规则流bpmn2_第5张图片
Drools如何使用规则流bpmn2_第6张图片
Drools如何使用规则流bpmn2_第7张图片
三. 规则和规则流搭配使用
按我自己的理解,规则流(bpmn2)里应该画一些“比较条件”,这些条件可能会变化,图像的形式更容易让人理解。
规则(drl)里写一些固定的结果,比如说当某种情况下,执行某些行为 判断情况写在bpmn里 执行结果写在drl里
(以下springboot工程)
pom 添加

		
			org.drools
			drools-core
			7.0.0.Final
		
		
			org.drools
			drools-compiler
			7.0.0.Final
		
		
			org.drools
			drools-decisiontables
			7.0.0.Final
		
		
			org.drools
			drools-templates
			7.0.0.Final
		

		
			org.kie
			kie-api
			7.0.0.Final
		
		
			org.jbpm
			jbpm-bpmn2
			7.0.0.Final
		

目录机构
Drools如何使用规则流bpmn2_第8张图片
建议先画一个只有开始结束的规则流,验证一下好不好使,再添加步骤。

(1) 新建drl
Drools如何使用规则流bpmn2_第9张图片
Drools如何使用规则流bpmn2_第10张图片
注意包的引用 !!!

package process
import java.util.Calendar;
import java.util.Date;
import com.summer.my.droolsproject.Fact.PersonFact;

rule "age-rule"
	ruleflow-group "age-check-group"
    lock-on-active true
    when
        p:PersonFact()
    then
        System.out.println("hello"+p.getName());
        if(p.getBirthday()!=null){
    		int age =0;
    		Calendar now = Calendar.getInstance();
            now.setTime(new Date());

            Calendar birth = Calendar.getInstance();
            birth.setTime(p.getBirthday());

            if (birth.after(now)) {
                age = 0;
            } else {
                age = now.get(Calendar.YEAR) - birth.get(Calendar.YEAR);
                if (now.get(Calendar.DAY_OF_YEAR) > birth.get(Calendar.DAY_OF_YEAR)) {
                    age += 1;
                }
            }
           
            p.setAge(age);
    	}

end

rule "teenager-rule"
	ruleflow-group "teenager"
    lock-on-active true
    when
        p:PersonFact()
    then
        System.out.println(p.getName()+"是一名青少年");
end

rule "adult-rule"
	ruleflow-group "adult"
    lock-on-active true
    when
        p:PersonFact()
    then
        System.out.println(p.getName()+"是一名成年");
end

(2) META-INF 文件夹 新建kmodule.xml



    
        
    

(3) 新建bpmn2 ??用bpmn2建也行?标签不一样
Drools如何使用规则流bpmn2_第11张图片
Drools如何使用规则流bpmn2_第12张图片
bpmn中的内容 有start 经过task
Drools如何使用规则流bpmn2_第13张图片
Drools如何使用规则流bpmn2_第14张图片
箭头所指的部分要对应规则(drl)中的 ruleflow-group 指定执行的规则组
Drools如何使用规则流bpmn2_第15张图片
Drools如何使用规则流bpmn2_第16张图片
注意箭头选项,优先级,和condition的语言
在规则流里用的类需要import
Drools如何使用规则流bpmn2_第17张图片
AppTest 规则和流都放在process下,如果分开放是不是得指定上级的包啊,要不kSession的package定义多个包?

package com.summer.my.droolsproject;

import org.apache.commons.lang3.time.DateUtils;
import org.junit.Test;
import org.kie.api.KieServices;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

import com.summer.my.droolsproject.Fact.PersonFact;

/**
 * Unit test for simple App.
 */
public class AppTest{
	@Test
	public void testOne(){
		try {
	        KieServices ks = KieServices.Factory.get();
	        KieContainer kContainer = ks.getKieClasspathContainer();
	        KieSession kSession = kContainer.newKieSession("ksession-process");
	        PersonFact person = new PersonFact();
	        person.setName("李某某");
	        person.setBirthday(DateUtils.parseDate("1999-01-01","yyyy-MM-dd"));
	      
	        kSession.insert(person);
	        kSession.startProcess("process.myProcess");
	        kSession.fireAllRules();  
	        kSession.dispose();
	        System.out.println(person.getName()+"的年龄是:"+person.getAge());
	    } catch (Throwable t) {
	        t.printStackTrace();
	    }
	}
	
}

输出结果
Drools如何使用规则流bpmn2_第18张图片
以xml形式查看规则流




  
  
    
      
    
    
      
        
          
        
      
      SequenceFlow_5
    
    
      
        
          
        
      
      SequenceFlow_5
      SequenceFlow_8
    
    
    
      SequenceFlow_8
      SequenceFlow_9
      SequenceFlow_10
    
    
    
      
        
          
        
      
      SequenceFlow_9
      SequenceFlow_11
    
    
      p:PersonFact(age<=18)
    
    
      
        
          
        
      
      SequenceFlow_10
      SequenceFlow_12
    
    
      eval(true)
    
    
      
        
          
        
      
      SequenceFlow_11
    
    
    
      
        
          
        
      
      SequenceFlow_12
    
    
  
  
    
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
          
        
      
      
        
        
        
        
      
      
        
        
        
        
      
      
        
        
        
        
      
      
        
        
        
        
      
      
        
        
        
        
      
      
        
        
        
        
      
    
  

PersonFact

package com.summer.my.droolsproject.Fact;

import java.util.Date;

public class PersonFact {
	
	private String name;
	
	private Integer age;
	
	private Date birthday;

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public Integer getAge() {
		return age;
	}

	public void setAge(Integer age) {
		this.age = age;
	}

	public Date getBirthday() {
		return birthday;
	}

	public void setBirthday(Date birthday) {
		this.birthday = birthday;
	}
    
	

}

你可能感兴趣的:(java)