java - 电子表格表的决定可以解决吗?
问题描述
我尝试使用 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
解决方案
我找到了我的问题的解决方案。电子表格可以位于除 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>
推荐阅读
- c# - 获取不同进程的环境变量
- python - 如何在python烧瓶中模拟redis会话
- cassandra - 最新的 cassandra 是否仍然支持各个行具有不同的列?
- django - gmail 的电子邮件模板变量、图像 src 属性问题(在 Django 中)
- redis - 启用 Istio 后 GCP Memorystore Redis 连接被拒绝
- python - Pandas 基于定义列表填充缺失行
- python - 无法替换熊猫数据框中的无值
- asp.net - 当应用程序位于服务器上时,HttpClient 在 localhost 上返回 json 响应,它返回 html
- css - CSS 网格中自动放置更改的条件样式
- xamarin.forms - 媒体插件在捕获 MVVM 后不显示图像