Drools 本人的使用实例

本文介绍了一个基于Drools规则引擎的实现案例,通过整合Spring框架和服务接口,实现了业务规则的动态加载与执行。文章详细展示了如何从数据库中读取规则定义并构建规则引擎,同时提供了规则过滤的方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

<!--drools-->
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>5.5.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-compiler</artifactId>
    <version>5.5.0.Final</version>
</dependency>



package com.sprucetec.tms.fee.service.impl.rule;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.sprucetec.tms.fee.utils.RuleBaseFacatory;
import com.sprucetec.tms.fee.service.rule.RuleEngineService;
import org.drools.RuleBase;
import org.drools.StatefulSession;
import org.drools.compiler.PackageBuilder;
import org.drools.spi.AgendaFilter;
import org.springframework.stereotype.Service;

import java.io.Reader;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by duyinqiang on 2016/12/12.
 * 规则接口实现类 .
 */
@Service
public class RuleEngineServiceImpl implements RuleEngineService {
    private RuleBase ruleBase;

    /**
     * 初始化规则引擎.
     *
     * @param drlRuleDomains
     */
    public void initEngine(List<String> drlRuleDomains) {
        // 设置时间格式
        System.setProperty("drools.dateformat", "yyyy-MM-dd HH:mm:ss");
        try {
            synchronized (this) {
                ruleBase = RuleBaseFacatory.getRuleBase();
                // 从DB加载规则
                PackageBuilder backageBuilder = this.getPackBuilderFromDrlDB(drlRuleDomains);
                ruleBase.addPackages(backageBuilder.getPackages());
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    @Override
    public <T> T executeRuleEngine(List<String> drlRuleDomains, T t) {
        if (CollectionUtils.isEmpty(drlRuleDomains)) {
            return t;
        }
        this.initEngine(drlRuleDomains);
        if (null == ruleBase.getPackages() || 0 == ruleBase.getPackages().length) {
            return null;
        }
        StatefulSession statefulSession = ruleBase.newStatefulSession();
        statefulSession.insert(t);
        // fire
        statefulSession.fireAllRules(new AgendaFilter() {
            @Override
            public boolean accept(org.drools.spi.Activation activation) {
                return !activation.getRule().getName().contains("_test");
            }
        });
        statefulSession.dispose();
        return t;
    }

    /**
     * 从Drl规则DB中读取规则
     *
     * @return
     * @throws Exception
     */
    private PackageBuilder getPackBuilderFromDrlDB(List<String> drlRuleDomains) {
        // 装载规则
        List<Reader> readers = this.buildReadersFromDrlDB(drlRuleDomains);

        // 装载PackageBuilder
        try {
            return this.buildPackageBuilder(readers);
        } catch (Exception e) {
            e.printStackTrace();
            return null;
        }
    }

    /**
     * 装载PackageBuilder
     *
     * @param readers
     * @return
     * @throws Exception
     */
    private PackageBuilder buildPackageBuilder(List<Reader> readers)
            throws Exception {
        if (null == readers || 0 == readers.size()) {
            return null;
        }
        PackageBuilder backageBuilder = new PackageBuilder();
        for (Reader r : readers) {
            backageBuilder.addPackageFromDrl(r);
        }
        // 检查脚本是否有问题
        if (backageBuilder.hasErrors()) {
            throw new Exception(backageBuilder.getErrors().toString());
        }
        return backageBuilder;
    }

    /**
     * 装载db中的规则到List<Reader>
     *
     * @return
     */
    private List<Reader> buildReadersFromDrlDB(List<String> drlRuleDomains) {
        List<Reader> readers = new ArrayList<Reader>();
        if (null == drlRuleDomains) {
            return readers;
        }
        for (String ruleContext : drlRuleDomains) {
            Reader br = new StringReader(ruleContext);
            readers.add(br);
        }
        return readers;
    }
}










package com.sprucetec.tms.fee.utils;

import com.alibaba.dubbo.common.utils.CollectionUtils;
import com.alibaba.dubbo.common.utils.StringUtils;
import com.google.common.collect.Lists;
import com.sprucetec.tms.fee.entity.rule.TemFeeCalculateRule;
import org.drools.RuleBase;
import org.drools.RuleBaseFactory;

import java.util.List;

/**
 * Created by meicai on 2016/12/12.
 * RuleBaseFacatory  规则基础工厂 .
 */
public class RuleBaseFacatory {
    private static RuleBase ruleBase;

    /**
     * 单实例RuleBase生成工具.
     *
     * @return
     */
    public static RuleBase getRuleBase() {
        return null != ruleBase ? ruleBase : RuleBaseFactory.newRuleBase();
    }

    /**
     * 构建规则对象.
     *
     * @param temFeeCalculateRules 规则实力对象集合.
     * @return
     */
    public static List<String> getDroolsRuleDomains(List<TemFeeCalculateRule> temFeeCalculateRules) {
        List<String> domains = Lists.newArrayList();
        if (CollectionUtils.isEmpty(temFeeCalculateRules)) {
            return domains;
        }
        String domain = "";
        StringBuffer stringBuffer = new StringBuffer();
        stringBuffer.append(temFeeCalculateRules.get(0).getPackageName() + "\n");
        stringBuffer.append("import com.sprucetec.tms.fee.entity.rule.*;" + "\n");//对应于规则文件的实体对象所放的包
        stringBuffer.append("import java.math.*;" + "\n");
        stringBuffer.append("import java.lang.*;" + "\n");
        stringBuffer.append("import java.io.*" + "\n");
        stringBuffer.append("import java.util.*" + "\n");
        for (int i = 0; i < temFeeCalculateRules.size(); i++) {
            stringBuffer.append("rule " + temFeeCalculateRules.get(i).getRuleName() + "_" + i + "\n");//规则名称
            if (StringUtils.isNotEmpty(temFeeCalculateRules.get(i).getDateEffective())) {
                stringBuffer.append("date-effective '" + temFeeCalculateRules.get(i).getDateEffective() + "'\n");//启用时间
            }
            if (StringUtils.isNotEmpty(temFeeCalculateRules.get(i).getDateExpires())) {
                stringBuffer.append("date-expires '" + temFeeCalculateRules.get(i).getDateExpires() + "'\n");//过期时间
            }
            stringBuffer.append("lock-on-active " + temFeeCalculateRules.get(i).getLockOnActive() + "\n");//规则是否循环执行
            stringBuffer.append("salience " + temFeeCalculateRules.get(i).getSalience() + "\n" + "when" + "\n");//优先级
            stringBuffer.append(temFeeCalculateRules.get(i).getRuleWhen() + "\n");//条件
            stringBuffer.append("then" + "\n");
            stringBuffer.append(temFeeCalculateRules.get(i).getRuleThen() + ";\n");//返回
            stringBuffer.append("end" + "\n");
        }
        domain=stringBuffer + "";
        domains.add(domain);
        return domains;
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值