Drools+freemarker动态实现规则引擎

本文讲述通过freemarker动态生成drools文件来实现规则引擎的使用。以下是项目中的实例练习(仅供参考),大家可以使用一些简单的业务逻辑。

1.引入依赖

<!--规则引擎drools-->
        <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>
        <dependency>
            <groupId>junit</groupId>
            <artifactId>junit</artifactId>
            <version>4.13.1</version>
            <scope>compile</scope>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-freemarker</artifactId>
        </dependency>

2.在resource下创建freemarker文件(drools和freemarker的语法可自行学习),rules文件夹名称不是固定的,只要你在读取时写一样的就好,如图:

3. 通过代码动态填充freemarker中的参数,并获取到文件内容。

private static String getTemplateContext(){
        String path = "/rules/";
        String filename = "test.ftl";
        Map<String,Object> data = new HashMap<>();
        data.put("num","1");
        data.put("isHand","2");
        FireAlertDrlReq fireAlertDrlReq = new FireAlertDrlReq();
        fireAlertDrlReq.setId(1);
        fireAlertDrlReq.setSomeMinute(1);
        fireAlertDrlReq.setHandAlert(1);
        fireAlertDrlReq.setSomeAlert(1);
        fireAlertDrlReq.setAlertTime(System.currentTimeMillis()-1*60*1000);
        fireAlertDrlReq.setNowTime(System.currentTimeMillis());
        fireAlertDrlReq.setAlertLevel("提醒");
        FireAlertDrlReq fireAlertDrlReq2 = new FireAlertDrlReq();
        fireAlertDrlReq2.setId(2);
        fireAlertDrlReq2.setSomeMinute(3);
        fireAlertDrlReq2.setHandAlert(1);
        fireAlertDrlReq2.setSomeAlert(3);
        fireAlertDrlReq2.setAlertTime(System.currentTimeMillis()-1*60*1000);
        fireAlertDrlReq2.setNowTime(System.currentTimeMillis());
        fireAlertDrlReq2.setAlertLevel("一般");
        List<FireAlertDrlReq> list = new ArrayList<>();
        list.add(fireAlertDrlReq);
        list.add(fireAlertDrlReq2);
        data.put("list", list);
        String template = null;
        try {
            template = FreeMarkerUtil.parseTemplate(path, filename, data);
        } catch (IOException e) {
            e.printStackTrace();
        }
        System.out.println(template);
        return template;
    }

4.通过freemarker生成drools文件后,进行加载。

private static void stringRule(String myRule){
        KieHelper helper = new KieHelper();
        helper.addContent(myRule, ResourceType.DRL);
        KieSession kieSession = helper.build().newKieSession();
        FireAlertDrlReq fireAlertDrlReq = new FireAlertDrlReq();
        FireAlertDrlResp fireAlertDrlResp = new FireAlertDrlResp();
        DroolService droolService = new DroolService();
        fireAlertDrlReq.setHandAlert(1);
        fireAlertDrlReq.setSomeAlert(1);
        fireAlertDrlReq.setAlertTime(System.currentTimeMillis()-1*60*1000);
        fireAlertDrlReq.setNowTime(System.currentTimeMillis());
        //参数填充drools文件中
        kieSession.insert(fireAlertDrlReq);
        kieSession.insert(fireAlertDrlResp);
        kieSession.insert(droolService);
        //启用drools规则引擎
        kieSession.fireAllRules();
        //调用完成关闭
        kieSession.dispose();
    }

5.测试

public static void main(String[] args) {

        String myRule = getTemplateContext();
        stringRule(myRule);
    }

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值