2015-02-11 4 views
0

Я новичок в Drools, поэтому заранее извиняюсь, если мой вопрос очень прост. Обычно, если я должен загрузить файл правил, я что-то вроде этого:Загрузка файла определенных правил на основе некоторых условий

KieServices kieServices = KieServices.Factory.get(); 
    KieContainer kContainer = kieServices.getKieClasspathContainer(); 
    kSession = kContainer.newStatelessKieSession();` 

Но как я могу изменить файл правил, основанный на каком-то состоянии? Скажем, у меня есть 3 класса (A, B и C), которые реализуют интерфейс (P), и у меня также есть функция, которая берет объект типа P (myFunction (P p) {...}).

Теперь, исходя из типа объекта, переданного myFunction(), мне нужно загрузить другой файл .drl. Например, объект a.drl if является экземпляром A и b.drl, если экземпляр B. Как я могу сделать это с помощью слюни 6?

+0

Это странный вопрос. Когда вы пишете вызов myFunction, вы знаете тип объекта, переданного как аргумент, а затем вы можете изменить код, загружающий файл .drl. Или даже во время выполнения: в методе вы можете определить класс 'p', а затем решить, какой файл .drl загрузить. – laune

+1

Я бы поставил вопрос, действительно ли вам ** нужно загружать различные базы знаний в зависимости от типа объекта. В любом случае совпадения правил основаны на типе объекта, поэтому было бы более нормальным иметь единую базу знаний со всеми правилами. – Steve

ответ

0

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

<kbase name="Kbase1" packages="rules.objectone"> 
    <ksession name="Kbase1Session" /> 
</kbase> 
<kbase name="Kbase2" packages="rules.objecttwo"> 
    <ksession name="Kbase2Session" /> 
</kbase> 

Тогда вы можете просто написать такие методы, как:

KieServices kieServices = KieServices.Factory.get(); 
KieContainer kContainer = kieServices.getKieClasspathContainer(); 

public void process(Object1 obj) { 
    kSession = kContainer.newStatelessKieSession("Kbase1Session"); 
    kSession.insert(obj); 
    kSession.fireAllRules(); 
} 
public void process(Object2 obj) { 
    kSession = kContainer.newStatelessKieSession("Kbase2Session"); 
    kSession.insert(obj); 
    kSession.fireAllRules(); 
} 

т.е. использовать другой сеанс для каждого объекта тип.

+0

Спасибо, но должен ли я создать отдельный пакет для каждого файла правил? Прямо сейчас у меня есть пакет под названием «drools.rules», в котором у меня есть 2 файла .drl (a.drl и b.drl). Если условие «a», тогда я должен использовать «a.drl», и если условие «b», тогда мне нужно загрузить «b.drl». – drunkenfist

+0

Да, вы бы ... хотя я все еще не уверен, что вам нужно загрузить разные DRL в зависимости от типов объектов. – Steve

Смежные вопросы