Как построить сеанс Kie при использовании файлов dsl и dslr?

Я новичок в слюнях. Я выполнил правила из моего файла drl. Вот мой файл drl.

rule "Person is 21"
salience 1
    when
        $person : Person(age>=21,car.equalsIgnoreCase("duster"))               
    then
        System.out.println($person.name);
end

вот мой файл модели

public class Person
{
    private String name;
    private int age;
    private String car;




    public Person()
    {

    }

    public Person(String name, int age,String car)
    {
        this.name = name;
        this.age = age;
        this.car=car;
    }

    public String getName()
    {
        return name;
    }

    public void setName(String name)
    {
        this.name = name;
    }

    public int getAge()
    {
        return age;
    }

    public void setAge(int age)
    {
        this.age = age;
    }


    public String getCar() {
        return car;
    }

    public void setCar(String car) {
        this.car = car;
    }

}

Вот мой код метода бегуна правил, который принимает правила и факты в качестве аргументов, создает сеанс kie и запускает правила.

 public void runRules(String[] rules, Object[] facts)
    {

        KieServices kieServices = KieServices.Factory.get();
        KieResources kieResources = kieServices.getResources();
        KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
        KieRepository kieRepository = kieServices.getRepository();

        for(String ruleFile : rules)
        {
            Resource resource = kieResources.newClassPathResource(ruleFile);

            // path has to start with src/main/resources
            // append it with the package from the rule
            kieFileSystem.write( resource);
        }

        KieBuilder kb = kieServices.newKieBuilder(kieFileSystem);

        kb.buildAll();

        if (kb.getResults().hasMessages(Level.ERROR))
        {
            throw new RuntimeException("Build Errors:\n" + kb.getResults().toString());
        }

        KieContainer kContainer = kieServices.newKieContainer(kieRepository.getDefaultReleaseId());

        KieSession kSession = kContainer.newKieSession();

        for (Object fact : facts)
        {
            kSession.insert(fact);
        }

        kSession.fireAllRules();
    }

Какие изменения мне следует сделать, если я использую файл DSLR (ниже файл DSLR)

rule "My First Rule"

    when
        Person is at least 21 and car is "duster"
    then
        Log : "hello world"

end

В eclipse файл drl, созданный из файла dslr, является правильным. Ниже приведено правило в файле drl, сгенерированном расширителем dsl (которое я мог видеть в средстве просмотра drl в eclipse для вышеуказанного dslr)

rule "My First Rule"

    when
        i: Person(age > 21, car=="duster")
    then
        System.out.println("hello world");

end

Я попытался запустить то же правило из моего файла drl, и оно успешно выполнилось

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

Resource resource = kieResources.newClassPathResource("MyDslr.dslr","dslExample.dsl");

и я получаю следующее исключение

Exception in thread "main" java.lang.RuntimeException: Build Errors:
Error Messages:
Message [id=1, level=ERROR, path=MyDslr.dslr, line=17, column=0
   text=[17] No mapping entries for expanding:         Person is at least 21 and
 car is "duster"]
Message [id=2, level=ERROR, path=MyDslr.dslr, line=17, column=0
   text=[17] Unable to expand: Person is at least 21 and car is "duster"]
Message [id=3, level=ERROR, path=MyDslr.dslr, line=19, column=0
   text=[19] No mapping entries for expanding:         Log : "hello world"]
Message [id=4, level=ERROR, path=MyDslr.dslr, line=19, column=0
   text=[19] Unable to expand:         Log : "hello world"]
Message [id=5, level=ERROR, path=MyDslr.dslr, line=17, column=0
   text=[ERR 102] Line 17:15 mismatched input 'is' in rule "My First Rule"]
---
Warning Messages:
---
Info Messages:

    at controller.RuleRunner.runRules(RuleRunner.java:43)
    at mainPackage.Main.main(Main.java:21)

Вот как мой файл dsl выглядит в eclipse (и он преобразует dslr в drl, и преобразованное правило не дает исключений, когда оно запускается непосредственно из файла drl)  введите описание изображения здесь

Пожалуйста, помогите мне здесь. И если есть примеры того, как запускать правила с использованием файлов kie api, dslr и dsl, то это тоже поможет.

Спасибо


person Yatin    schedule 18.08.2015    source источник


Ответы (1)


Звонок

... = kieResources.newClassPathResource("MyDslr.dslr","dslExample.dsl")

не может быть правильным - сравните Javadoc для этого метода: второй аргумент должен указывать кодировку.

Однако эта последовательность утверждений работает:

FileInputStream fis1 = new FileInputStream( "simple/simple.dsl" );
kfs.write( "src/main/resources/simple.dsl",
           kieServices.getResources().newInputStreamResource( fis1 ) );
FileInputStream fis2 = new FileInputStream( "simple/simple.dslr" );
kfs.write( "src/main/resources/simple.dslr",
           kieServices.getResources().newInputStreamResource( fis2 ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();

Вы должны вызвать свой метод runRules(String[] rules, Object[] facts) с массивом имен путей, DSL, а также DSLR.

person laune    schedule 18.08.2015