Передача объектов класса в файл правил Drools (drt) - PullRequest
0 голосов
/ 28 мая 2020

Я использую шаблон Drools для принятия решений, я создал экземпляр класса и передал объекты класса в сеанс K ie, используя insert

В файле drt я попытался сравнить столбцы шаблона с объектами класса и определенными параметрами, которые прошли порог, а затем установка приоритета на основе значения в файле шаблона

Формат файла шаблона (Excel)

Parameter     Mountpoint       Threshold      Severity
Disk            /root           80              MINOR
Disk            /tmp            90              MAJOR

My class Capacity {

private String component;
private String subComponent;
privat Integer value;

public String getComponent() {
            return component;
        }
        public void setComponent(String component) {
            this.component = component;
        }
        public String getSubComponent() {
            return subComponent;
        }
        public void setSubComponent(String subComponent) {
            this.subComponent = subComponent;
        }
        public Integer getValue() {
            return value;
        }
        public void setValue(Integer value) {
            this.value = value;
        }

public Capacity()        
        {
            super();
            this.component = component;
            this.subComponent = subComponent;
            this.value = value;
        } 

}

В другом классе я Я запускаю KieSession и внедряю объекты класса емкости и загружаю файл шаблонов Drool

        KnowledgeBuilder kbuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
    KieSessionConfiguration sessionConfig = KnowledgeBaseFactory.newKnowledgeSessionConfiguration();
    sessionConfig.setOption( ClockTypeOption.get( ClockType.PSEUDO_CLOCK.getId() ) );
    try {
        loadRuleTemplate(DATA_FILE, RULE_TEMPLATE_FILE, "OperationalMeasurement", 2, 1);
    } catch (IOException errorMsg) {
        log.error(errorMsg.getMessage());       }
    InternalKnowledgeBase kbase = KnowledgeBaseFactory.newKnowledgeBase();
    kbase.addPackages(kbuilder.getKnowledgePackages());       
    KieSession kieSession =  kbase.newKieSession(sessionConfig, null);
    sessionClock = ksession.getSessionClock();
    ksession.insert(Capacity);
    ksession.fireAllRules();
    ksession.dispose();

файл правил

template header
Parameter
Mountpoint
Threshold
Severity

package com.test.drools;

dialect "java"

template "OperationalMeasurement"

rule "Check_Threshold_@{row.rowNumber}"
ruleflow-group "capacityManagement"
salience 500
when
   $capacity: Capacity(component == "@{Parameter}" && subComponent == "@{Mountpoint}" && value >= "@{Threshold}")
  then   
    System.out.println("Thresold cross for Component and Priority is set " + @{Severity}"); 
end
end template

Когда я запускаю это, компонент обрабатывается как буквальная строка вместо емкости class, и хотя я не получаю никаких ошибок, она просто выводит все содержимое файла drt в консоль. И я, кажется, не получаю заявления Sysout

1 Ответ

1 голос
/ 29 мая 2020
Компонент

рассматривается как буквальная строка, а не как переменная класса емкости

Не уверен, что вы имеете в виду. какой «компонент» обрабатывается как литерал?

Согласно сгенерированному правилу, которое вы добавили в качестве комментария, в создаваемых правилах есть некоторые ошибки:

    System.out.println("Thresold crossed for Component::" +component + " and Priority is set " + Major"); 

В строке выше предполагается, что «компонент» будет переменной, но переменной с таким именем нет. Перед строкой «Major» также отсутствует кавычка. Я бы посоветовал вам изменить свой шаблон на что-то вроде этого:

rule "Check_Threshold_@{row.rowNumber}"
ruleflow-group "capacityManagement"
salience 500
when
   $capacity: Capacity(component == "@{Parameter}" && subComponent == "@{Mountpoint}" && value >= "@{Threshold}")
  then   
    System.out.println("Threshold cross for Component:: @{Parameter} and Priority is set to @{Severity}"); 
end
end template

Это должно генерировать действительный DRL.

Еще одна вещь, о которой стоит упомянуть, - это то, что по какой-то странной причине я никогда полностью не понял, Drools не будет жаловаться, если в ваших Базах Знаний есть ошибки (т.е. ошибки в файлах DRL). Вы должны самостоятельно проверять наличие ошибок перед использованием Базы знаний. Класс KnowledgeBuilder имеет метод hasErrors() и методы getResults(), которые вы можете использовать для проверки на наличие ошибок. Если вы используете KieContainer, то у вас есть метод verify(), который вы можете использовать. Как вы загружаете свои ДХО в KieBase?

Надеюсь, поможет,

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...