Можно ли ссылаться на правила из .drl и .xls в рамках одной и той же программы в JBoss Drools? - PullRequest
0 голосов
/ 21 января 2019

Я просматриваю Drools как возможность для применения правил. Я могу заставить Drools ссылаться на набор правил из файла .xls и файла .drl независимо друг от друга в данный момент времени. Однако в моем случае бывают случаи, когда правила не существуют в виде файла .xls и будут запрограммированы в файле .drl. Из-за этого мне интересно, если в рамках одного и того же выполнения программы, оба файла могут быть использованы в зависимости от определенных критериев ввода? Например, если State == "GA", тогда используйте .xls, иначе, если State == "FL" затем используйте .drl.

Я прочитал различные KieConcepts и понял их на высоком уровне, и я считаю, что мне придется создать каждый файл правил как отдельный KieContainer, а затем загрузить их в один KieBase на основе определений дано каждому здесь. Однако, когда дело доходит до этого шага, я запутываюсь относительно того, как это достигается. У меня уже есть два отдельных экземпляра, смогу ли я просто объединить эти два в одной программе, используя KieBase?

Реализация .xls

public static void main (String[] args)   {
    try {
        KieServices ks = KieServices.Factory.get();
        // add excel sheet to knowledge base
        Resource dt = ResourceFactory.newClassPathResource("dtables/StateInterest.xls");
        KieFileSystem kieFileSystem = ks.newKieFileSystem().write(dt);

        KieBuilder kieBuilder = ks.newKieBuilder(kieFileSystem);
        kieBuilder.buildAll();

        KieRepository kieRepository = ks.getRepository();

        ReleaseId krDefaultReleaseID = kieRepository.getDefaultReleaseId();
        KieContainer kieContainer = ks.newKieContainer(krDefaultReleaseID);

        KieSession kSession = kieContainer.newKieSession();

        // go !
        StateInterestRequest stateInterestRequest = new StateInterestRequest();
        stateInterestRequest.setPolicyIssueState("GA");
        stateInterestRequest.setPolicyIssueDate("10/2018");

        kSession.insert(stateInterestRequest);
        kSession.fireAllRules();

Реализация .drl

public static final void main(String[] args) {
    try {
        KieServices ks = KieServices.Factory.get();
        KieContainer kContainer = ks.getKieClasspathContainer();
        KieSession kSession = kContainer.newKieSession("ksession-rules");

        // go !
        StateInterestRequest stateInterestRequest = new StateInterestRequest();
        stateInterestRequest.setPolicyIssueState("FL");
        stateInterestRequest.setPolicyIssueDate("2008-03-04");      

        kSession.insert(stateInterestRequest);
        kSession.fireAllRules();

В качестве дополнения, если возможно, это будет достигнуто через main() окончательной объединенной программы или в рамках самих правил?

1 Ответ

0 голосов
/ 22 января 2019

Да, вы можете объединить оба типа файлов в одном проекте. Вы можете написать правила в формате xls, которые будут соответствовать состоянию «GA», и правилам, записанным в файле DRL, которые будут соответствовать другим состояниям. Я рекомендую сначала прочитать документацию по Drools, чтобы вы получили основные понятия о правилах, KJars и т. Д. [1]. Я думаю, что эта глава может быть полезной для вас [2].

[1] https://docs.jboss.org/drools/release/7.16.0.Final/drools-docs/html_single/index.html
[2] https://docs.jboss.org/drools/release/7.16.0.Final/drools-docs/html_single/index.html#_builddeployutilizeandrunsection

...