Слюни не соответствуют моему факту

Я новичок в слюнях и определил два правила:

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

И

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

Когда я вставляю новый факт com.mgaudin.sandbox.drools.models.Lead, вывод следующий:

com.mgaudin.sandbox.drools.models.Lead

Следовательно, мы можем сделать вывод, что:

  1. Правила компилируются правильно
  2. Правила выполняются
  3. Первое правило соответствует факту типа "com.mgaudin.sandbox.drools.models.Lead"

Так почему же правило «rule2» не соответствует?

Спасибо !


person Maxime    schedule 20.06.2017    source источник
comment
Означает ли это что-то, что у вас есть два файла .DRL? Обе скомпилированы в одну KieBase? Как? Вы проверили, что в нем есть два правила?   -  person laune    schedule 20.06.2017
comment
Оба скомпилированы в одну и ту же KieBase (первое правило было просто для того, чтобы доказать, что мои слюни работают правильно, и отображать имя класса фактов). Я попытался скомпилировать свое правило либо с помощью KieFileSystem/KieBuilder, либо с помощью KnowledgeBuilder. Оба скомпилировались нормально, но дали тот же результат. Кроме того, чтобы убедиться, что мой файл DRL был использован, я попытался изменить тот же файл с помощью eval(true), что выводит Это совпадение!.   -  person Maxime    schedule 20.06.2017
comment
Если в вашей истории нет скрытых зацепок, то я бы сказал, что это ошибка. Сделайте полный пример (минимум Java, DRL), укажите версию Drools и поднимите JIRA. - Если вы отредактируете свой вопрос, добавив весь этот код и информацию, я посмотрю на это.   -  person laune    schedule 21.06.2017


Ответы (3)


ОК, я нашел ответ, и он не связан с Drools, он связан с Spring-boot-devtools!

Я не знаю точного механизма, но чтобы включить быструю горячую перезагрузку (даже если сигнатура метода изменится), spring-boot-devtools должен связываться с JVM и проксировать некоторые объекты, в моем случае факт. Из-за этого, а также из-за того, что Drools соответствует действительности, правило не сработало.

Все, что мне нужно было сделать, это удалить зависимость maven от spring-boot-devtools.

person Maxime    schedule 22.06.2017
comment
Я могу подтвердить, что у меня была такая же проблема с этими же инструментами, и удаление spring-boot-devtools устранило проблему. - person Renato Dinhani; 06.12.2017
comment
Столкнулся с той же проблемой и исправил, удалив spring-boot-devtools - person Pant; 13.01.2019
comment
для нас проблема возникла, когда мы пытаемся прочитать эти правила как kjar из весеннего загрузочного приложения. Способен понять, что мы должны поддерживать ту же структуру пакета, чтобы факты загружались и правильно распознавались в правилах при условии. - person Jajikanth pydimarla; 28.04.2021

Правила не совпадают, так как ваш факт (Лид) загружен другим ClassLoader, поэтому Drools его не видит. Это делается средствами разработки, как описано здесь: https://docs.spring.io/spring-boot/docs/current/reference/html/using-boot-devtools.html#using-spring-boot-перезагрузкапротивперезагрузки

Но нет необходимости отключать devtools, просто добавьте следующие строки в META-INF/spring-devtools.properties, как было указано здесь:
restart.include.drools=/drools-[\\s\\S]+\.jar restart.include.kie=/kie-[\\s\\S]+\.jar Таким образом, Drools загружается с помощью Restart Classloader — так же, как и ваши классы.

person VitalyZ    schedule 14.02.2018
comment
Это сохранит в RestartClassLoader только слюни и баночки, но не ваши факты и пользовательские классы. Не гарантируется, что использование этого решит проблему. - person Pant; 13.01.2019

У меня была проблема, что вставленные факты никогда не распознаются внутри правил, но не было проблем с глобальными переменными.

Удаление

весенняя загрузка-devtools

зависимость облегчила мне жизнь.

person Janko Ljubić    schedule 17.05.2020