首页 > 解决方案 > 电子表格表的决定可以解决吗?

问题描述

我尝试使用 excel 格式 (*.xlsx) 的表格决策,一个电子表格。我不想将电子表格放在我的应用程序的文件夹资源中。所以我创建了一个文件夹:文件夹/Discount.xls。

但是当我运行我的程序时,它会抛出一个 File not found 异常。如果电子表格文件不在资源文件夹中,则似乎无法加载,因此在 jar 中。

我想知道我是否可以在电子表格时制作程序,因为我的规则可以动态加载?我会选择一个或另一个电子表格来热更改我的规则。但我不知道这是否可能。

我有一些代码:

    KieServices kieServices = KieServices.Factory.get();
    File file = new File("folder/Discount.xls");
    Resource resource = ResourceFactory.newFileResource(file);
    KieFileSystem kieFileSystem = kieServices.newKieFileSystem().write(resource);
    KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
    kieBuilder.buildAll();
    KieRepository kieRepository = kieServices.getRepository();
    ReleaseId krDefaultReleaseId = kieRepository.getDefaultReleaseId();
    KieContainer kieContainer = kieServices.newKieContainer(krDefaultReleaseId);
    KieSession kieSession = kieContainer.newKieSession();

前面的代码抛出运行时异常:

Exception in thread "main" java.lang.RuntimeException: Cannot find KieModule: org.default:artifact:1.0.0

标签: javadroolsspreadsheet

解决方案


我找到了我的问题的解决方案。电子表格可以位于除 java 资源文件夹之外的另一个文件夹中。我的课堂测试如下:

public class Main {

    private static InternalKnowledgeBase createKnowledgeBaseFromSpreadsheet() throws Exception {

        DecisionTableConfiguration decisionTableConfiguration = KnowledgeBuilderFactory.newDecisionTableConfiguration();
        decisionTableConfiguration.setInputType(DecisionTableInputType.XLS);
        KnowledgeBuilder knowledgeBuilder = KnowledgeBuilderFactory.newKnowledgeBuilder();
        File file = new File("folder/Discount.xls");
        Resource resourceFile = ResourceFactory.newFileResource(file);
        knowledgeBuilder.add(resourceFile, ResourceType.DTABLE, decisionTableConfiguration);

        if (knowledgeBuilder.hasErrors()) {
            throw new RuntimeException(knowledgeBuilder.getErrors().toString());
        }

        InternalKnowledgeBase internalKnowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
        Collection<KiePackage> kiePackages = knowledgeBuilder.getKnowledgePackages();
        internalKnowledgeBase.addPackages(kiePackages);
        return internalKnowledgeBase;
    }

    public static void main(String[] args) {

        (new Main()).run();
    }

    public void run() {
        System.out.println("--- Start Code ---");
        StatelessKieSession session = null;

        try {
            InternalKnowledgeBase knowledgeBase = createKnowledgeBaseFromSpreadsheet();
            session = knowledgeBase.newStatelessKieSession();
        } catch (Exception e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        Customer customer = new Customer(CustomerType.INDIVIDUAL, 1);
        System.out.println(customer.toString());
        session.execute(customer);
        System.out.println(customer.toString());
        System.out.println("--- End Code ---");
    }
}

我的客户类(必须添加 getter、setter 并隐藏 toString 方法):

public class Customer {

    public enum CustomerType {
        INDIVIDUAL, BUSINESS;
    }
    private CustomerType type;
    private int years;
    private int discount;

    public Customer(CustomerType individual, int years) {
        this.type = individual;
        this.years = years;
    }
}

我的 *.pom 文件包含:

<dependencies>
    <dependency>
        <groupId>org.kie</groupId>
        <artifactId>kie-ci</artifactId>
        <version>7.28.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.drools</groupId>
        <artifactId>drools-decisiontables</artifactId>
        <version>7.28.0.Final</version>
    </dependency>
    <dependency>
        <groupId>org.slf4j</groupId>
        <artifactId>slf4j-log4j12</artifactId>
        <version>1.7.7</version>
        <scope>runtime</scope>
    </dependency>


推荐阅读