2017-06-14 4 views
0

Je travaille sur la mise en place de règles métier dans le moteur de bave. Nous ne pouvons pas utiliser l'interface utilisateur de l'espace de travail KIE pour créer des règles. Description de problème: Créer un microservice de démarrage de ressort de fin d'application angulaire (UI front-end) pour créer des règles. Ces règles créées doivent être actualisées dynamiquement sans avoir à redémarrer jvm et les autres micro-services qui souhaitent utiliser ces règles. Par exemple: octroi de crédit ou taux d'intérêt basé sur l'historique de crédit du concessionnaire, la durée avec la banque et toutes les nouvelles règles qui pourraient être conçues selon l'auteur.J'ai commencé à regarder sur cela et théoriquement on pourrait construire quelque chose comme ça en utilisant API de bave bibliothèque du compilateur. Voici un exemple de code. pour rafraîchir en temps réel, il y a quelque chose qui s'appelle KnowledgeAgent. https://docs.jboss.org/drools/release/5.2.0.Final/drools-guvnor-docs/html/ch09.htmlDrools Création de règles (DRL) Programmation ne fonctionne pas dans drools-distribution-6.5.0.Final

What is the new accepted way of programmatically creating new drools rules in Drools 6?

Mon problème est que je ne suis pas en mesure de faire ce work.Code fonctionne très bien mais je ne suis pas en mesure de voir le fichier DRL obtenir le mode de débogage written.In, je peux voir objet chaîne avec la structure drl appropriée. Quelqu'un at-il rencontré ce problème avant?

J'ai vu quelques exemples sur GitHub où les gens ont fait l'emploi yoman à intégrer Drools au printemps boot.I peut commencer par la construction de mon service, mais je dois être sûr que ce quelque chose qui est possible de faire

+0

Ceci n'est pas clair. Quel code devrait écrire un fichier DRL où vous ne "voyez pas le fichier drl s'écrire"? – laune

+0

https://stackoverflow.com/questions/27570431/what-is-the-new-accepted-way-of-programmatically-creating-new-drools-rules-in-dr – MrWayne

+0

Où voulez-vous "voir le drl fichier écrit »et comment vérifiez-vous que ce n'est pas? - Tu fais ça assez difficile pour les gens qui essaient de t'aider. – laune

Répondre

0

Le code suivant vous aidera à créer la règle de bave en utilisant le code. Il est déconseillé et la plupart des gens utilisent l'interface kie-web pour concevoir et modifier les règles de bave. Vous ne savez pas comment modifier les fichiers .drl déjà créés. start.Going

package com.sample.model;

import java.io.BufferedWriter; 
import java.io.File; 
import java.io.FileInputStream; 
import java.io.FileWriter; 
import java.io.IOException; 
import java.io.InputStream; 

import org.drools.compiler.lang.DrlDumper; 
import org.drools.compiler.lang.api.DescrFactory; 
import org.drools.compiler.lang.api.PackageDescrBuilder; 
import org.kie.api.KieServices; 
import org.kie.api.builder.KieBuilder; 
import org.kie.api.builder.KieFileSystem; 
import org.kie.api.builder.Message; 
import org.kie.api.builder.ReleaseId; 
import org.kie.api.io.Resource; 
import org.kie.api.io.ResourceType; 
import org.kie.api.runtime.KieContainer; 

//@SuppressWarnings("restriction") 
public class GenerateRule { 

    public static void main(String[] args) { 
    // TODO Auto-generated method stub 
    KieContainer container=build(KieServices.Factory.get()); 
    System.out.println(container.getReleaseId()); 
    System.out.println(container.getKieBase()); 
    } 

    public static KieContainer build(KieServices kieServices){ 

    KieFileSystem fileSystem=kieServices.newKieFileSystem();  
    ReleaseId releaseId=kieServices.newReleaseId("com.example.rulesengine", 
     "model-test", "1.0-SNAPSHOT"); 
    fileSystem.generateAndWritePomXML(releaseId); 
    //fileSystem.write("D:/workspace/DroolSamples/src/main/resources/rules/rules.drl", getResource(kieServices, "D:/workspace/DroolSamples/src/main/resources/rules/rules.drl")); 
    addRule(fileSystem); 

    KieBuilder kieBuilder = kieServices.newKieBuilder(fileSystem); 
    kieBuilder.buildAll(); 
    if (kieBuilder.getResults().hasMessages(Message.Level.ERROR)) { 
     throw new RuntimeException("Build Errors:\n" + 
      kieBuilder.getResults().toString()); 
    } 

    return kieServices.newKieContainer(releaseId); 
    } 
@SuppressWarnings("restriction") 
    private static void addRule(KieFileSystem kieFileSystem) { 
    PackageDescrBuilder packageDescrBuilder = DescrFactory.newPackage(); 


    packageDescrBuilder 
      .name("com.sample.model") 
      .newRule() 
      .name("Is of valid age") 
      .lhs() 

      .pattern("Person").constraint("age < 18") 
      .id("$a", true).end() 
      //.pattern().id("$a", false).end() 
      .end() 
      .rhs("$a.setShowBanner(false);") 
      //.rhs("insert(new Person())") 
      .end(); 


    String rules = new DrlDumper().dump(packageDescrBuilder.getDescr()); 

    KieFileSystem fileSystem=kieFileSystem.write("D:/newrule.drl", rules); 
    try{ 
     // create new file 
     File file = new File("src/main/resources/rules/test.drl"); 
     file.createNewFile(); 
     FileWriter fw = new FileWriter(file.getAbsoluteFile()); 
     BufferedWriter bw = new BufferedWriter(fw); 
     bw.write(rules); 
     // close connection 
     bw.close(); 
     System.out.println("File Created Successfully"); 
    }catch(Exception e){ 
     System.out.println(e); 
    } 


} 
    private static Resource getResource(KieServices kieServices, String resourcePath) { 

    try { 
    // InputStream is = com.google.common.io.Resources.getResource(resourcePath).openStream(); //guava 
     InputStream is=new FileInputStream(new File(resourcePath)); 
     return kieServices.getResources() 
        .newInputStreamResource(is) 
        .setResourceType(ResourceType.DRL); 
    } catch (IOException e) { 
     throw new RuntimeException("Failed to load drools resource file.", e); 
    } 
} 
}