2017-06-15 3 views
0

Je suis nouveau à baver donc cette question pourrait être basée sur l'opinion. J'ai utilisé drools6.5 dans nos applications Java autonomes, mais je voudrais maintenant l'ajouter à notre/webapps existant sur Tomcat7 (JDK8). Les webapps sont simples basés sur jsp/servlet/html (principalement codés à la main - sans Spring).Drools sur Tomcat

Existe-t-il des exemples qui pourraient m'aider à utiliser Drools6.5 sur notre Tomcat/webapps? J'ai essayé de créer la structure suivante en espérant que cela fonctionnerait. webapps/ WEB-INF/ |--classes/all_my_classes.class META-INF/ |--maven |---pom.properties |--kmodule.xml |--rules/myrule.drl

Mais le code a généré une exception de pointeur null lorsque kSession.insert() est appelée.

DroolsPojoIn message = new DroolsPojoIn(); 
//## message setters. 
KieServices ks = KieServices.Factory.get(); 
KieContainer kContainer = ks.getKieClasspathContainer(); 
KieSession kSession = kContainer.newKieSession("ksession-rules"); 
kSession.insert(message); //Generated NullPointerException. 

Ce même code et cette structure fonctionnent bien dans les applications autonomes.

Merci & Cordialement Shawn

+0

Si le vidage de pile commence à cette ligne, kSession est nul et le "même code" ne peut pas fonctionner autrement. Comment créez-vous cet objet? – laune

+0

Je viens d'ajouter l'exemple de code. Le kSession est initialisé dans les lignes précédentes. Mais il génère toujours un NullPointer .. – Shawn

Répondre

0

J'ai trouvé la solution dans l'URL suivante

Loading and updating rules from a database in Drools 6

D'abord, je supprimé le dossier META-INF (Il n'a pas été nécessaire). Ensuite, j'ai déclaré les 3 principales variables de classe en dehors de toutes les fonctions. Il était plus facile pour nous de charger manuellement les fichiers bave à travers les/chemins que de configurer les environnements.

KieServices ks = null; 
KieContainer kContainer; 
KieSession kSession; 

Puis j'ai ajouté le code suivant à la servlet public void init() fonction.

ks = KieServices.Factory.get();   
/* File System Handler */ 
KieFileSystem kfs = ks.newKieFileSystem(); 
kfs.write("/data/rules/lesson01.drl", "/data/rules/sample02.drl"); 
KieBuilder kieBuilder = ks.newKieBuilder(kfs).buildAll(); 
Results results = kieBuilder.getResults(); 
if(results.hasMessages(Message.Level.ERROR)){ 
    System.out.println(results.getMessages()); 
     throw new IllegalStateException("### errors ###"); 
    } 
kContainer = ks.newKieContainer(ks.getRepository().getDefaultReleaseId()); 
KieBase kieBase = kContainer.getKieBase(); 
kSession = kContainer.newKieSession(); 

Dans le public void doGet(), j'ai déclenché les règles.

DroolsPojo message = new DroolsPojo(); /*My Simple Pojo object*/ 
message.setMessage("Marketing Strategy"); 
message.setStatus(DroolsPojo.MARKET); 
kSession.insert(message); 
kSession.fireAllRules(); 

S'il y a une meilleure façon de le faire s'il vous plaît faites le moi savoir.

+0

Ne posez pas de questions dans les réponses. Et on ne sait pas pourquoi cela corrige le NPE. – laune