2016-12-20 13 views
3

DOL 파일을 사용하여 프로젝트를 완료했습니다. 사용자가 규칙을 삭제하고 업데이트하려는 경우 내 규칙 파일에서 해당 작업을 수행해야합니다. 이것이 내 규칙입니다. 파일 :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

귀하의 질문에 대한 정보가 너무 적습니다. 사용자가 프로젝트에서 어떤 것을 어떻게 변경합니까? 어떤 종류의 GUI 또는 무엇? 그렇다면 사용자가 원하는 온도를 입력 할 수있는 필드를 만들 수 있으며 그 값을 하드 코드 대신 규칙으로 전달하면됩니다. 25 – Enigo

답변

1

을 원하는 내가 방법을 fallowing하여 이러한 문제를 해결 같은 문제를 통과, 나는 유지하고있다 모든 규칙 파일 데이터베이스.

나는 모든 규칙 파일을 테이블에 보관하고 있으며 IMEI 번호를 기반으로 모든 규칙 파일을로드하고 있습니다 (제 경우에는 하나의 어댑터, 즉 고유 한 IMEI 번호를 갖는 어댑터에 대해 하나의 규칙을 생성합니다).

아래 코드에서 먼저 datbase에서 규칙 파일을로드하고 해당 문자열을 리소스 beacuse 리소스 팩토리로 변환하면 리소스가 생성자 인수로만 허용됩니다. 그 것을 ksession에 저장하고 규칙을 실행하십시오.

편집 및 삭제 작업의 경우 데이터베이스에서 하나의 플래그를 작성하고 해당 플래그가 참이면 데이터베이스 파일로 룰 파일을 다시 업데이트하십시오. 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", "[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(); 

    } 

여기에서 데이터베이스에서 규칙 파일을 불러 와서 모든 규칙을 실행하십시오.

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. 사실 나는 database.i에 규칙 파일을 저장하고 있는데 생각이 들지만 깃발에 대해서 말해줘. –

+0

플래그는 부울 데이터 유형이있는 하나의 열을 만들고 해당 규칙 파일에서 변경된 사항이 true이면 해당 부울을 true로 만들고, true 인 경우 다시 규칙 파일을 업데이트합니다. – Mahabaleshwar

+0

폭풍을 사용하고 있기 때문에 항상 그 플래그가 참인지 거짓인지 확인하고 있습니다. – Mahabaleshwar