是否可以在 JBoss Drools 的同一程序中引用 .drl 和 .xls 的规则?

Is it possible to reference rules from both a .drl and .xls within the same program in JBoss Drools?

我正在通过 Drools 寻找规则应用程序用例的可能性。此时,我能够让 Drools 从 .xls 文件和 .drl 文件中独立引用规则集。但是,在我的例子中,有时规则不作为 .xls 文件存在,而是在 .drl 文件中进行编程。因此,我想知道在同一个程序执行中,是否可以根据特定输入条件使用这两个文件?例如,如果 State == "GA" 则使用 .xls,否则如果 State == "FL" 然后使用 .drl.

我已经阅读了不同的 KieConcepts 并在高层次上理解了它们,我相信我必须将每个规则文件创建为一个单独的 KieContainer,然后将它们加载到一个基于 definitions given to each here. 然而,当谈到这一步时,我对这是如何完成的感到困惑。我已经创建了两个单独的实例,我可以使用 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() 还是在规则本身内完成的?

是的,您可以将两种类型的文件合并到一个项目中。您可以编写 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