当前位置: 首页 > 知识库问答 >
问题:

如何编辑和更新Drools规则文件?

纪鸿禧
2023-03-14

我的项目使用drools专家手段(DRL)文件。在规则文件中,如果用户想删除和更新规则,应该怎么做?

规则文件:

package com.sample;

import com.sample.Tuplebean;
import com.sample.DroolsBolt;

dialect "mvel"

rule "SafetyAlert-Critical"
when
    t:Tuplebean(t.getSmoke() == true && t.getSmoke_density() == true && t.getTemperature() > 25.0)
then
    DroolsBolt.insertToAlertLog("alert generated");
end

例如,用户希望将温度值更改为30.0。

共有1个答案

连成益
2023-03-14

在我的应用程序中,我遇到了相同的问题,我通过休整的方式修复了这些问题,我正在维护所有规则文件数据库。

我保持所有的规则文件在表中,我加载每个规则文件的基础上IMEI(在我的情况下,我生成一个规则为一个适配器即适配器具有唯一的IMEI号)。

在下面的代码中,首先从datbase加载规则文件,并将该字符串转换为资源,因为资源工厂只接受资源作为构造函数参数。并将其存储到K会话中,然后取消规则。

对于编辑和删除操作,我在数据库中设置一个标志,如果该标志为true,则再次将规则文件更新到数据库表中。如果为false,则加载相同的旧规则文件。

在这里,您将生成规则文件并保存到数据库表,如果标志为true,则再次重新生成规则文件。

public void generateDrrols(String macAddress) throws SQLException, ClassNotFoundException, IOException{
        logger.error("++++Generate drools file started++++");
        Class.forName("org.postgresql.Driver");
        Connection conn = DriverManager.getConnection("jdbc:postgresql://10.0.0.5:5432/iotdb",
                    "postgres", "track@123");

        //String sql="SELECT alert_playload FROM iot.alert_configuration WHERE drools_boolean=true and alert_configuration_id=94 && 95";
         String sql = ""
              + "select drools_condtion , iot.alert_configuration.alert_status , iot.alert_configuration.websocket_key , device_id , iot.alert_configuration.device_configuration_id , "
              + "email , iot.alert_configuration.mac_address , phone , sensor_id , iot.alert_configuration.sensor_configuration_id , alert_configuration_id , site_id , "
              + "startdatetime , enddatetime , exludedays , timetoexclude , log_update_time ,iot.sensor_configuration.sensor_name "
              + "from iot.alert_configuration "
              + "join iot.sensor_configuration on iot.sensor_configuration.sensor_configuration_id=iot.alert_configuration.sensor_configuration_id "
              + "where iot.alert_configuration.mac_address=? and soft_delete_flag=false";

         PreparedStatement prepareStatement = conn.prepareStatement(sql);
         prepareStatement.setString(1, macAddress);
         ResultSet rs = prepareStatement.executeQuery();
        //ResultSet rs = sta.executeQuery(sql);

        final ResultSetGenerator converter = new ResultSetGenerator();
        InputStream in = getClass().getResourceAsStream("/alert.drt"); 
        final String drl = converter.compile(rs, in);
        System.out.println(drl);
        rs.close();
        KnowledgeBuilder kbuilder =
              KnowledgeBuilderFactory.newKnowledgeBuilder();
        kbuilder.add(ResourceFactory.newByteArrayResource(drl.getBytes()),
                   ResourceType.DRL);
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages(kbuilder.getKnowledgePackages());
        StatefulKnowledgeSession kSession = 
        kbase.newStatefulKnowledgeSession();
        logger.error("++++Reading rule file ie., rule.drl started++++");

        logger.error("++++Making drool table status false++++");
        String sql2="update iot.drool_rules set drool_rules=? where mac_address=?";
        PreparedStatement prepareStatement2 = conn.prepareStatement(sql2);
        prepareStatement2.setString(1, drl.toString());
        prepareStatement2.setString(2, macAddress);
        boolean execute2 = prepareStatement2.execute();
        String sql1="update iot.alert_configuration set storm_drool_status=false where mac_address=?";
        //Statement createStatement = conn.createStatement();
        PreparedStatement prepareStatement3 = conn.prepareStatement(sql1);
        prepareStatement3.setString(1, macAddress);
        boolean execute = prepareStatement3.execute();

    }

在这里,您可以从数据库中借用规则文件并触发所有规则。

KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    try{
        String sql="select drool_rules from iot.drool_rules where mac_address=?";
        PreparedStatement prepareStatement = connectPostgres.prepareStatement(hql);
        prepareStatement.setString(1, topicId);
        ResultSet executeQuery1 = prepareStatement.executeQuery();
        String rules=null;
        while(executeQuery1.next()){
            rules=executeQuery1.getString(1);
        }
        String i=null;
        String replace = rules.replace('"', '\"');
        System.out.println(replace);
        Reader reader=(Reader)new StringReader(replace);
        Resource myResource = ResourceFactory.newReaderResource(reader);
        kbuilder.add(myResource, ResourceType.DRL);
    }
    catch(Exception e)
    {
        e.printStackTrace();
    }
        KnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
        kbase.addKnowledgePackages( kbuilder.getKnowledgePackages() );
        ksession = kbase.newStatefulKnowledgeSession();
 类似资料:
  • 我在eclipse中创建了一个java项目,它会自动从外部目录中获取所有. drl文件并执行该目录中的所有规则。因此,这可以随时执行动态添加新规则。现在,我想使用引导规则编辑器来帮助非技术用户将新规则添加到该目录中,而不是创建一个新的drool文件。我已经开始使用drools-workbench,但我仍然不知道如何将这个eclipse项目与drools-wb中可用的引导规则编辑器功能集成。 是否有

  • 作为概念证明,我已经使用Drools workbench创建数据对象和DRL文件。我创建了jar文件并部署到kie服务器(带有容器)。全部通过工作台UI完成。我使用C#应用程序中的KIE REST服务通过XML发布输入对象(使用批处理执行)来触发规则,并得到了我正在寻找的响应。 但是在实际场景中,我们将有自己的规则编辑器(为了便于使用)来根据现有对象的属性创建规则。一旦规则保存到我们的数据库中,我

  • 问题内容: 在启动时如何从数据库表中加载规则并从Drools 6.2.0中的同一表中更新规则呢?我找到了一个使用Drools 5 的示例,我可能可以将它从Scala转换为Java,但看起来API发生了巨大变化……例如,我看不到RuleBaseFactory类。 任何样品或文件将不胜感激。 问题答案: 我不确定从哪儿拿来的。以下是在Drools 5.3(可能更早)至5.6中的完成方式: 省略号指示用

  • 我试图将我的流程变量放入业务规则任务中,并在该任务中更改该变量,但值保持不变。我做错了什么?流程是在kie工作台中开发的,不使用Eclipse。 在触发规则之前,我的变量在脚本任务中初始化,如 谢谢你的帮助!

  • 我的问题是: 在Drools规则中,有没有一种方法可以拦截“成功”事件?为了更好地解释。。。有一种方法可以在规则的所有条件都为真时调用侦听器? 注意:我不想设置一个全局对象(在会话上)来管理规则的“然后”子句中的这个条件。 我正在寻找一个已经在Drools上实现的解决方案 规则示例