2016-12-20 14 views
3

Я выполнил свой проект с использованием файла экспертных средств drools (DRL). В моем файле правил, если пользователь хочет удалить и обновить правило, для этого мне следует делать. Это мое правило файл:Как отредактировать и обновить файл правил Drools

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 

, например, если пользователь хочет изменить значение температуры с местом 25 он хочет 30.

+0

Ваш вопрос имеет слишком мало информации. Как ваши пользователи меняют что-то в проекте? Какой-то графический интерфейс или что? Если это так, то вы можете создать поле, где пользователь может ввести температуру, которую он хочет, и вы просто передаете это значение правилу вместо жесткого кодирования. 25 – Enigo

ответ

1

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

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

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

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

Здесь вы создаете файл правила и сохраняете его в таблице базы данных, и если флаг имеет значение 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", "[email protected]"); 

     //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(); 

    } 

Здесь ваш loaing файл правил из базы данных и запускаются все правила.

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(); 
+0

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

+0

Флаг просто делает один столбец с булевыми типами данных, и если какие-либо изменения произошли с этим файлом правила, значит, вы делаете логическое значение true, если оно истинно, снова обновляйте файл правила. – Mahabaleshwar

+0

Я использую шторм, поэтому я всегда проверяю этот флаг как истинный или ложный. – Mahabaleshwar