Как отредактировать и обновить файл правил Drools?

В моем проекте используется файл экспертных средств 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.


person Rahul Pandey    schedule 20.12.2016    source источник
comment
в вашем вопросе слишком мало информации. Как ваши пользователи что-то меняют в проекте? Какой-то графический интерфейс или что? Если это так, то вы можете создать поле, в котором пользователь может ввести температуру, которую он хочет, и вы просто передаете это значение правилу вместо жестко запрограммированного 25.   -  person Enigo    schedule 21.12.2016


Ответы (1)


В моем приложении я столкнулся с той же проблемой, я исправил эту проблему следующим образом, я поддерживаю всю базу данных файлов правил.

Я сохраняю все файлы правил в таблицах и загружаю каждый файл правил на основе номера IMEI (в моем случае я создаю одно правило для одного адаптера, т.е. адаптера с уникальным номером IMEI).

В приведенном ниже коде сначала загрузите файл правил из базы данных и преобразуйте эту строку в ресурс, поскольку фабрика ресурсов принимает только ресурс в качестве аргумента конструктора. и сохраните это в ksession и запустите правила.

Для операции редактирования и удаления я делаю один флаг в базе данных, если этот флаг снова верен, обновите файл правил в таблице базы данных. если оно ложно, загрузите тот же старый файл правил.

Здесь вы создаете файл правил и сохраняете его в таблице базы данных, и если флаг установлен, и снова вы повторно создаете файл правил.

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();
person Mahabaleshwar    schedule 03.02.2017
comment
спасибо... махабалешвар. на самом деле я также храню файл правил в базе данных. У меня есть идея, но просто расскажите мне о флаге. - person Rahul Pandey; 03.02.2017
comment
Флаг - это просто сделать один столбец с логическими типами данных, и если какие-либо изменения произошли с этим файлом правил, это означает, что вы делаете это логическое значение истинным, если оно истинно, снова обновите файл правил. - person Mahabaleshwar; 03.02.2017
comment
Я использую шторм, поэтому я всегда проверяю этот флаг, это правда или ложь. - person Mahabaleshwar; 03.02.2017