规则引擎Drools的使用

引入maven

        <dependency>
            <groupId>org.drools</groupId>
            <artifactId>drools-templates</artifactId>
            <version>7.14.0.Final</version>
        </dependency>
        <dependency>
            <groupId>org.kie</groupId>
            <artifactId>kie-spring</artifactId>
            <version>7.14.0.Final</version>
        </dependency>

工具类封装

import org.kie.api.KieBase;
import org.kie.api.KieBaseConfiguration;
import org.kie.api.builder.Message;
import org.kie.api.builder.Results;
import org.kie.api.conf.EventProcessingOption;
import org.kie.api.io.ResourceType;
import org.kie.api.runtime.KieSession;
import org.kie.internal.utils.KieHelper;
import org.springframework.util.CollectionUtils;

import java.util.List;
import java.util.Map;

/**
 * drools架构规则工具
 *
 * @author 向振华
 * @date 2022/06/30 17:29
 */
public class KieUtils {

    /**
     * 执行全部规则
     *
     * @param entity  规则文件中的实体类
     * @param globals 全局变量
     * @param drl     规则文件
     */
    public static void fireAllRules(Object entity, Map<String, Object> globals, String drl) {
        //会话对象,用于和规则引擎交互
        KieSession kieSession = getKieSession(entity, globals, drl);
        //激活规则引擎,如果规则匹配成功则执行规则
        kieSession.fireAllRules();
        //关闭会话
        kieSession.dispose();
    }

    /**
     * 执行全部规则
     *
     * @param kSession
     */
    public static void fireAllRules(KieSession kSession) {
        //激活规则引擎,如果规则匹配成功则执行规则
        kSession.fireAllRules();
        //关闭会话
        kSession.dispose();
    }

    /**
     * 获取KieSession
     *
     * @param entity  规则文件中的实体类
     * @param globals 全局变量
     * @param drl     规则文件
     * @return
     */
    public static KieSession getKieSession(Object entity, Map<String, Object> globals, String drl) {
        KieSession kieSession = getKieSession(drl);
        kieSession.insert(entity);
        if (!CollectionUtils.isEmpty(globals)) {
            for (String key : globals.keySet()) {
                kieSession.setGlobal(key, globals.get(key));
            }
        }
        return kieSession;
    }

    /**
     * 获取KieSession
     *
     * @param drls 规则文件
     * @return
     */
    public static KieSession getKieSession(String... drls) {
        KieHelper kieHelper = new KieHelper();
        for (String drl : drls) {
            kieHelper.addContent(drl, ResourceType.DRL);
        }
        verify(kieHelper);
        KieBaseConfiguration config = kieHelper.ks.newKieBaseConfiguration();
        config.setOption(EventProcessingOption.STREAM);
        KieBase kieBase = kieHelper.build(config);
        //创建KieSession
        return kieBase.newKieSession();
    }

    /**
     * 校验规则文件
     *
     * @param drl 规则文件
     */
    public static void verify(String drl) {
        KieHelper kieHelper = new KieHelper();
        kieHelper.addContent(drl, ResourceType.DRL);
        verify(kieHelper);
    }

    /**
     * 校验
     *
     * @param kieHelper
     */
    private static void verify(KieHelper kieHelper) {
        Results results = kieHelper.verify();
        List<Message> messages = results.getMessages(Message.Level.WARNING, Message.Level.ERROR);
        if (!CollectionUtils.isEmpty(messages)) {
            StringBuilder error = new StringBuilder("规则文件错误 ");
            for (Message message : messages) {
                error.append(message.getText()).append(";");
            }
            throw new RuntimeException(error.toString());
        }
    }
}

定义entity

/**
 * @author 向振华
 * @date 2022/06/30 16:11
 */
public class DemoEntity {

    private String name;
    private String remark;

    public String getName() {
        return name;
    }

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

    public String getRemark() {
        return remark;
    }

    public void setRemark(String remark) {
        this.remark = remark;
    }

    public DemoEntity() {

    }

    public DemoEntity(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return "DemoEntity{" +
                "name='" + name + '\'' +
                ", remark='" + remark + '\'' +
                '}';
    }
}

创建规则文件demo.drl

package demo
import com.xzh.drools.entity.DemoEntity

rule "demo"
    when
        $demo:DemoEntity(name contains "小明")
    then
        $demo.setRemark("哈喽" + $demo.getName());
        System.out.println("规则执行 ---> " + $demo.getRemark());
end

测试

@RunWith(SpringRunner.class)
@SpringBootTest(classes = Application.class)
public class DemoTest {

    @Test
    public void test1() throws IOException {
        DemoEntity entity = new DemoEntity("小明");
        ResourcePatternResolver resourcePatternResolver = new PathMatchingResourcePatternResolver();
        Resource resource = resourcePatternResolver.getResource("classpath:rules/demo.drl");
        byte[] bytes = IOUtils.toByteArray(resource.getInputStream());
        String drl = new String(bytes);
        KieUtils.fireAllRules(entity, null, drl);
    }
}

结果

规则执行 ---> 哈喽小明

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值