Drools — краткое введение в механизм правил

Java

Слюни- Когда мои одноклассники не сказали мне, я никогда не слышал об этой штуке, и я не знал, что это такое, поэтому я пополнял сухой корм поздно ночью....

Введение в слюни

Слюни просто правила, он живет по правилам. Для некоторых сложных и изменчивых бизнес-сценариев недостаточно полагаться на наши повседневные суждения.Правила меняются быстро.При неконтролируемых факторах (погода, даты, деятельность и т. д.) правила также меняются, и проект становится невозможным. чтобы изменить строку с ним.

Drools — это один из механизмов правил, который соответствует текущим изменениям бизнес-сценариев. Как только данные удовлетворяют условию сопоставления, будет выполнена соответствующая логическая обработка:

when 满足什么样的条件
then 最终的结果

Зачем вам нужны правила, чтобы действовать?

В некоторых простых и несложных системах для оценки необходимы только условные операторы, и нет необходимости вводить механизм правил. Однако для огромного бизнес-сценария и проекта, где в каждый момент времени каждый день могут быть задействованы разные правила, это не соответствует текущей ситуации. Это только доставит разработчикам и людям, занимающимся продуктом, головную боль.

Бизнес-правила часто следуют следующим принципам:

  • они независимы
  • их легко обновить
  • Минимальный объем информации, необходимый для каждого элемента управления правилом
  • Они позволяют людям из разных слоев общества сотрудничать

Процесс выполнения Drl

Механизм правил Drools преобразует бизнес-правила в деревья выполнения:

Каждое условие правила разделено на небольшие блоки, соединенные и повторно используемые в древовидной структуре. Каждый раз, когда данные добавляются в механизм правил, они будут оцениваться в дереве, подобном этому, и поступать в узел действия, где они будут помечены как данные, готовые для выполнения определенного правила.

Введение в простое демо

Я просто реализовал небольшую локальную демонстрацию, которая представляет собой простое введение в текущий механизм правил.

Текущая иерархия каталогов проекта

├── pom.xml
├── src
│   ├── main
│   │   ├── java
│   │   │   └── com
│   │   │       └── montos
│   │   │           ├── DroolsStartApplication.java
│   │   │           ├── controller
│   │   │           │   └── TestController.java
│   │   │           ├── entity
│   │   │           │   └── Message.java
│   │   │           ├── impl
│   │   │           │   └── DroolsServiceImpl.java
│   │   │           └── service
│   │   │               └── DroolsService.java
│   │   └── resources
│   │       ├── META-INF
│   │       │   └── kmodule.xml
│   │       └── rules
│   │           └── Helloworld.drl
│   └── test
│       └── java
└── target
    ├── classes
    │   ├── META-INF
    │   │   └── kmodule.xml
    │   ├── com
    │   │   └── montos
    │   │       ├── DroolsStartApplication.class
    │   │       ├── controller
    │   │       │   └── TestController.class
    │   │       ├── entity
    │   │       │   └── Message.class
    │   │       ├── impl
    │   │       │   └── DroolsServiceImpl.class
    │   │       └── service
    │   │           └── DroolsService.class
    │   └── rules
    │       └── Helloworld.drl
    └── generated-sources
        └── annotations

pom.xml зависимости

<dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-core</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-compiler</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-decisiontables</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-api</artifactId>
            <version>7.0.0.Final</version>
        </dependency>
        <!-- lombok -->
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <version>1.16.20</version>
            <scope>provided</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
    </dependencies>

класс serviceImpl

public class DroolsServiceImpl implements DroolsService {

    @Override
    public String fireRule() {
        KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");

        Message message = new Message();
        message.setMessage("Good Bye");
        message.setStatus(Message.GOODBYE);
        kSession.insert(message);//插入
        kSession.fireAllRules();//执行规则
        kSession.dispose();
        return message.getMessage();

    }
}

kmodule.xml

<kmodule xmlns="http://jboss.org/kie/6.0.0/kmodule">
    <kbase name="rules" packages="rules">
        <ksession name="ksession-rules"/>
    </kbase>
</kmodule>

Helloworld.drl

package com.montos.drools.test1 #虚拟包名,不一定需要与物理存在的包名一致
import com.montos.entity.Message
dialect  "mvel" # 方言  默认是java

rule "Hello World" # 规则名
    dialect "mvel"
    when
        m : Message(status.equals(Message.HELLO), message : message )#条件
    then
        System.out.println( message);#动作
    modify ( m ) { message = "Goodbye cruel world",status = Message.GOODBYE }; //更新语句,会导致引擎重新检查所有规则是否匹配条件,而不管其之前是否执行过
end

rule "Good Bye"
    dialect "java"
    when
       Message( status == Message.GOODBYE, message : message )
    then
        System.out.println( message );
end

Вышеприведенное является кратким введением в некоторые важные коды.serviceЛогика в классе реализации, получить настроенную политику правил, а затем в соответствии сdrlПравила и политики в файле управляют результатами.

Вышеприведенное является кратким введением в текущую версию Drools.Большая часть информации в Интернете посвящена простым знакомствам с API и аналогичным текущим представлениям, но для сложных бизнес-сценариев нет демонстрации. У кого есть информация, поделитесь со мной, буду очень благодарен.

Часть информации в статье взята из:blog.CSDN.net/ешьте нежные тычинки/art…