Drools6.4动态加载规则之(一)模板的简单应用

1.template

drools6开始提供模板的概念;

模板能为我们提供简单的规则替换;做到简单的规则动态加载;

本例子的demo基于最新稳定版drools6.4

2.项目结构


3.pom依赖

<!--drools-->
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-core</artifactId>
    <version>6.4.0.Final</version>
</dependency>
<dependency>
    <groupId>org.drools</groupId>
    <artifactId>drools-decisiontables</artifactId>
    <version>6.4.0.Final</version>
</dependency>

4.代码

Message.java
package com.caicongyang.drools.templates;

import java.io.Serializable;

/**
 * @author caicongyang1
 * @version id: Message, v 0.1 16/9/29 下午3:06 caicongyang1 Exp $$
 */
public class Message implements Serializable {

    private static final long serialVersionUID = -3168739008574463191L;

    public static final int HELLO = 0;
    public static final int GOODBYE = 1;

    private String message;

    private int status;

    public String getMessage() {
        return this.message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public int getStatus() {
        return this.status;
    }

    public void setStatus(int status) {
        this.status = status;
    }

}

MyDataProvider.java
package com.caicongyang.drools.templates;

import java.util.Iterator;
import java.util.List;

import org.drools.template.DataProvider;

/**
 * @author caicongyang1
 * @version id: Message, v 0.1 16/9/29 下午3:06 caicongyang1 Exp $$
 */
public class MyDataProvider implements DataProvider {

    private Iterator<String[]> iterator;

    public MyDataProvider(List<String[]> rows) {
        this.iterator = rows.iterator();
    }

    public boolean hasNext() {
        return iterator.hasNext();
    }

    public String[] next() {
        return iterator.next();
    }
}

DataProviderCompilerTest.java
package com.caicongyang.drools.templates;

import java.util.ArrayList;

import org.drools.template.DataProviderCompiler;
import org.kie.api.KieServices;
import org.kie.api.builder.KieBuilder;
import org.kie.api.builder.KieFileSystem;
import org.kie.api.builder.Message.Level;
import org.kie.api.builder.model.KieBaseModel;
import org.kie.api.builder.model.KieModuleModel;
import org.kie.api.io.KieResources;
import org.kie.api.runtime.KieContainer;
import org.kie.api.runtime.KieSession;

/**
 *
 * Drools模板实例应用
 *
 * @author caicongyang1
 * @version id: Message, v 0.1 16/9/29 下午3:06 caicongyang1 Exp $$
 */
public class DataProviderCompilerTest {

    public static void main(String[] args) {
        ArrayList<String[]> rows = new ArrayList<String[]>();
        rows.add(new String[] { "1", "status == 0" });

        MyDataProvider tdp = new MyDataProvider(rows);
        DataProviderCompiler converter = new DataProviderCompiler();
        String drl = converter.compile(tdp, "/rules/rule_template_1.drl");

        System.out.println(drl);

        KieServices kieServices = KieServices.Factory.get();
        KieResources resources = kieServices.getResources();
        KieModuleModel kieModuleModel = kieServices.newKieModuleModel();//1

        KieBaseModel baseModel = kieModuleModel.newKieBaseModel("FileSystemKBase").addPackage("rules");//2
        baseModel.newKieSessionModel("FileSystemKSession");//3
        KieFileSystem fileSystem = kieServices.newKieFileSystem();

        String xml = kieModuleModel.toXML();
        System.out.println(xml);//4
        fileSystem.writeKModuleXML(xml);//5

        String path = DataProviderCompilerTest.class.getClass().getResource("/").getPath();
        fileSystem.write("src/main/resources/rules/rule1.drl", drl);

        KieBuilder kb = kieServices.newKieBuilder(fileSystem);
        kb.buildAll();//7
        if (kb.getResults().hasMessages(Level.ERROR)) {
            throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
        }
        KieContainer kContainer = kieServices.newKieContainer(kieServices.getRepository().getDefaultReleaseId());

        KieSession kSession = kContainer.newKieSession("FileSystemKSession");

        Message message = new Message();
        message.setMessage("Hello World");
        message.setStatus(Message.HELLO);

        kSession.insert(message);
        kSession.fireAllRules();
        kSession.dispose();

    }

}

rule_template_1.dl
template header
RULE_ID
RULE_KEY1

package com.caicongyang.drools.templates;

import com.caicongyang.drools.templates.Message;

template "RULE"
rule "RULE_@{RULE_ID}"
    when
        m: Message(@{RULE_KEY1})
    then
        System.out.println(m.getMessage());
end
end template


更多精彩内容请继续关注我的博客http://blog.csdn.net/caicongyang

记录与分享,你我共成长 -from  caicongyang


  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
Drools是一个基于规则引擎的开源项目,允许用户定义和管理业务规则,并将其与应用程序集成。Drools的一个重要特性是能够动态更新规则,以便在运行时更改应用程序的行为。 使用Drools动态更新规则的过程如下: 1. 配置规则引擎:在应用程序中集成Drools,并配置规则引擎的相关参数,如规则库的位置、编译方式等。 2. 定义规则:使用Drools提供的语法,定义需要的规则规则由条件和动作组成,条件用于匹配输入数据,而动作则定义了规则执行时应该执行的操作。 3. 加载规则:将规则加载Drools规则引擎中。可以选择在应用程序初始化时加载规则,或者在运行时动态加载规则。 4. 动态更新规则:在运行时,通过修改规则库中的规则文件或从数据库、文件等外部来源加载新的规则,实现动态更新规则Drools提供了API接口,可以通过调用相关方法动态添加、修改或删除规则。 5. 触发规则引擎执行:一旦规则库发生变化,需要手动或自动触发规则引擎执行规则Drools提供了执行规则的方法,可以在应用程序中调用以触发规则的执行。 动态更新规则可以带来很多好处。首先,它允许业务人员在不修改应用程序代码的情况下改变业务逻辑,提高了灵活性和可维护性。其次,动态更新规则可以在不停机的情况下进行,不会影响应用程序的正常运行。最后,它还可以减少应用程序的维护成本,因为业务规则不再需要硬编码在代码中,而是可以通过规则引擎进行管理和维护。 综上所述,Drools动态更新规则功能可以帮助应用程序实现灵活的业务逻辑,并提供可维护和可扩展的规则管理机制。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值