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