2017-06-20 3 views
0

Je suis nouveau à bave et ont défini deux règles:Drools ne correspond pas à mon fait

package com.mgaudin.sandbox.drools.rules; 

import com.mgaudin.sandbox.drools.models.Lead; 

rule "rule1" 
    when 
     l: Object() 
    then 
     System.out.println(l.getClass().getCanonicalName()); 
end 

Et

package com.mgaudin.sandbox.drools.rules; 

import com.mgaudin.sandbox.drools.models.Lead; 

rule "rule2" 
    when 
     Lead() 
    then 
     System.out.println("It's a match !"); 
end 

Lorsque j'insère une nouvelle com.mgaudin.sandbox.drools.models. fait le plomb, la sortie est la suivante:

com.mgaudin.sandbox.drools.models.Lead 

on peut donc en déduire que:

  1. Les règles compile correctement
  2. Les règles sont exécutées
  3. La première règle correspond à un fait de type « com.mgaudin.sandbox.drools.models.Lead »

Alors, pourquoi le règle "rule2" ne correspond pas?

Merci!

+1

Cela signifie-t-il que vous semblez avoir deux fichiers .DRL? Les deux sont-ils compilés dans un seul KieBase? Comment? Avez-vous vérifié qu'il y a deux règles? – laune

+0

Les deux sont compilés dans le même KieBase (la première règle était juste là pour prouver que mes drools fonctionnaient correctement et afficher le nom de la classe). J'ai essayé de compiler ma règle en utilisant le KieFileSystem/KieBuilder ou en utilisant un KnowledgeBuilder. Les deux compilés bien mais ont produit le même résultat. Aussi, pour être sûr que mon fichier DRL a été utilisé, j'ai essayé de modifier le même fichier avec eval (true) qui sort "It's a match!". – Maxime

+1

S'il n'y a pas de problèmes cachés dans votre histoire, je dirais que c'est un bug. Faire un exemple complet (Java minimum, DRL), énoncer la version de Drools et élever un JIRA. - Si vous éditez votre question, en ajoutant tout ce code et info, je l'examinerais. – laune

Répondre

2

OK J'ai trouvé la réponse sans rapport avec Drools, elle est liée à Spring-boot-devtools!

Je ne connais pas le mécanisme exact mais pour activer le rechargement rapide à chaud (même si une signature de méthode change), spring-boot-devtools doit jouer avec la JVM et proxifier certains objets, dans mon cas. Pour cette raison et la façon dont Drools correspond au fait, la règle ne s'est pas déclenchée.

Tout ce que j'avais à faire était de supprimer la dépendance de maven à spring-boot-devtools.

+0

Je peux confirmer que j'ai eu le même problème avec ces mêmes outils et la suppression de spring-boot-devtools a résolu le problème. –

1

Les règles ne correspondent pas puisque votre fait (Lead) est chargé avec ClassLoader différent afin que les Drools ne le voient pas. Cela se fait par devtools comme décrit ici: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-spring-boot-restart-vs-reload

Mais ce n'est pas nécessaire de désactiver devtools, il suffit d'ajouter les lignes suivantes à META-INF/spring-devtools.properties comme cela a été insinué here:
restart.include.drools=/drools-[\\s\\S]+\.jar restart.include.kie=/kie-[\\s\\S]+\.jar Alors Drools est chargé avec Restart Classloader - le même que vos classes.