2016-12-20 3 views
3

J'ai fait mon projet en utilisant le fichier des drools experts (DRL). Dans mon fichier de règles si l'utilisateur veut supprimer et mettre à jour la règle, pour cela que dois-je faire? fichier:Comment éditer et mettre à jour le fichier de règles 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 

par exemple, si l'utilisateur veut modifier la valeur de la température avec lieu de 25 il veut 30.

+0

votre question a beaucoup trop peu d'information. Comment vos utilisateurs changent-ils quelque chose dans le projet? Une sorte d'interface graphique ou quoi? Si oui, alors vous pouvez faire un champ où l'utilisateur peut taper la température qu'il veut et vous venez de passer cette valeur à la règle au lieu de coder en dur 25 – Enigo

Répondre

1

Dans ma demande je passé par même problème je fixe les problèmes de mise en jachère façon, je suis maintenant la base de données de tous les fichiers de règles. Je conserve tout le fichier de règles dans des tables et je charge chaque fichier de règles basé sur le numéro IMEI (dans mon cas, je génère une règle pour un adaptateur, c'est-à-dire un adaptateur ayant un numéro IMEI unique).

Dans le code ci-dessous, chargez d'abord le fichier de règles à partir de la base de données et convertissez cette chaîne en ressource Resource plant en tant qu'argument de constructeur. et stocker cela dans la ksession et de tirer les règles.

Pour l'opération d'édition et de suppression, je fais un drapeau dans la base de données, si cet indicateur est vrai, mettre à jour le fichier de la règle dans la table de la base de données. s'il est faux, chargez le même ancien fichier de règles.

Ici, vous générez le fichier de règles et enregistrez-le dans la table de la base de données. Si l'indicateur est vrai, vous pouvez à nouveau générer le fichier de règles.

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

    } 

Voici votre fichier de règles à partir de la base de données et de déclencher toutes les règles.

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

merci ... mahabaleshwar. En fait, je stocke également le fichier de règles dans la base de données.J'ai eu une idée, mais dis-moi juste au sujet du drapeau. –

+0

Flag est juste faire une colonne avec des types de données booléens et si des changements sont arrivés à ce fichier de règles signifie que vous faites de ce booléen le vrai, si c'est le cas, mettez à jour le fichier de la règle. – Mahabaleshwar

+0

J'utilise la tempête donc je vérifie toujours ce drapeau c'est vrai ou faux. – Mahabaleshwar