Drools Expert объект вывода в Scala - PullRequest
3 голосов
/ 26 октября 2011

Я новичок в Scala и Drools Expert, и мне нужна помощь в получении информации из сессии Drools.Я успешно настроил некоторые классы Scala, которые управляются правилами Drools.Теперь я хочу создать объект для хранения набора выходных фактов для обработки вне Drools.Вот что у меня есть.

У меня есть простой объект, который хранит числовой результат (сгенерированный в RHS правила) вместе со строкой комментария:

class TestResults {
    val results = new MutableList[(Float, String)]()

    def add(cost: Float, comment: String) {
        results += Tuple2(cost, comment)
    }
}

В файле DRL у меня естьследующее:

import my.domain.app.TestResults

global TestResults results

rule "always"
    dialect "mvel"
    when
        //
    then
        System.out.println("75 (fixed)")
        results.add(75, "fixed")
end

Когда я запускаю код, который включает это, я получаю следующую ошибку:

org.drools.runtime.rule.ConsequenceException: rule: always
    at org.drools.runtime.rule.impl.DefaultConsequenceExceptionHandler.handleException(DefaultConsequenceExceptionHandler.java:39)
...
Caused by: [Error: null pointer or function not found: add]
[Near : {... results.add(75, "fixed"); ....}]
                                                       ^
[Line: 2, Column: 9]
    at org.mvel2.optimizers.impl.refl.ReflectiveAccessorOptimizer.getMethod(ReflectiveAccessorOptimizer.java:997)

Мне кажется, что с моим определением TestResults есть что-то глупоеобъект в Scala, такой, что Java, скомпилированная Drools, не может его увидеть.Типовое несоответствие, возможно?Я не могу понять это.Какие-либо предложения?Спасибо!

Ответы [ 3 ]

2 голосов
/ 26 октября 2011

Вам необходимо инициализировать глобальную переменную results до выполнения сеанса.Вы можете инициализировать его, используя:

knowledgeSession.setGlobal("results", new TestResults()))
0 голосов
/ 27 октября 2011

Правильно .. и попробуйте добавить условие в ваше правило, чтобы оно имело больше смысла (когда часть).Оценка состояния - это самая важная особенность механизмов правил, написание правил без условий не имеет слишком большого смысла.

Приветствия

0 голосов
/ 26 октября 2011

Попробуйте

import my.domain.app.TestResults

global TestResults results

rule "always"
    dialect "mvel"
    when
        //
    then
        System.out.println("75 (fixed)")
        results().add(75.0f, "fixed")
end

Я предполагаю, что типы не совпадают, а сообщение об ошибке плохое. (75 - Инт, хочет Флоат)

...