2010-07-16 2 views
3

Je rencontre un comportement étrange dans Drools 4.0.7, mais c'est peut-être juste parce que je ne comprends pas comment fonctionne Drools. Supposons qu'il existe une classe "A" qui a une propriété appelée "propriété".La rétraction de Drools fait que la règle ne se déclenche pas

Comme faits, j'ai la liste suivante d'A: A1, property = 123 A2, property = 345 A3, propriété = 123

J'ai deux règles suivantes:

rule "Rule 1 - Remove all A's that have property set to 123" 
    salience 1000 
    lock-on-active true 
when 
    $listOfAs : ArrayList collect(A(property == "123")) 
then 
    for (Object a: $listOfAs) { 
     retract (a) 
    } 
end 

rule "Rule 2 - Do stuff with remaining A's" 
    salience 900 
    lock-on-active true 
when 
    $listOfAs : ArrayList collect(A()) 
then 
... 
end 

Ma compréhension est "Règle 1" va supprimer les faits de la classe A qui ont la propriété à 123. Quand il arrive à "Règle 2", ne devrait pas le "listOfAs" seulement celui qui reste (c'est-à-dire celui où la propriété est réglé sur "345"). Ce que je remarque, c'est que "Règle 2" ne s'exécute tout simplement pas même si je suppose qu'il y a toujours un objet "A" qui n'a pas été rétracté. Si je commente le "se rétracter" il exécute "Règle 2" très bien.

Est-ce qu'il me manque quelque chose à propos de ces règles?

Merci. Justin

+0

Avez-vous réussi à le faire fonctionner? J'observe aussi le comportement similaire dans Drools 5.4. –

Répondre

1

Je soupçonne que le problème ici est l'utilisation de «verrouillage sur actif». Étant donné que la première règle est activée, elle empêche l'activation de l'autre règle.

Selon les documents lock-on-actif est:

«Une valeur booléenne « true » inhibe activations supplémentaires de toutes les règles de cet indicateur défini au sein du même groupe ou RuleFlow ordre du jour. »

Questions connexes