我正在使用DROOLS编写程序。为了编写规则,我使用DSL。我有个问题。更改DSLR文件(删除,添加)后更新工作内存中的规则?添加规则后,新规则不会出现在工作内存中。
public class Drools {
private KnowledgeBase knowledgeBase;
public Drools() {
knowledgeBase = createKnowledgeBaseFromDSL();
}
private KnowledgeBase createKnowledgeBaseFromDSL() {
KnowledgeBuilder builder = KnowledgeBuilderFactory.newKnowledgeBuilder();
builder.add(ResourceFactory.newClassPathResource("rules/simple.dsl"), ResourceType.DSL);
builder.add(ResourceFactory.newClassPathResource("rules/simple.dslr"), ResourceType.DSLR);
if (builder.hasErrors()) {
throw new RuntimeException(builder.getErrors().toString());
}
KnowledgeBase knowledgeBase = KnowledgeBaseFactory.newKnowledgeBase();
knowledgeBase.addKnowledgePackages(builder.getKnowledgePackages());
return knowledgeBase;
}
public void fireAllRules() throws IOException {
Properties properties = new Properties();
try (BufferedReader fileReader = Files.newBufferedReader(Paths.get("src/main/resources/setting.properties"))) {
properties.load(fileReader);
StatefulKnowledgeSession session = knowledgeBase.newStatefulKnowledgeSession();
try {
HttpReader reader = new HttpReader(properties.getProperty("url"));
session.insert(reader);
session.fireAllRules();
} finally {
session.dispose();
}
}
}
}
答案 0 :(得分:0)
更新DSL或DRL或DSLR文件不会自动更改正在进行的会话。
Drools 5有一项监控目录并自动重建知识库和更新会话的服务。但这在Drools 6中并没有继续下去。
做什么取决于您的使用案例。您可以使用Java功能轻松监视目录。然后,重建与您拥有的代码一样。然后,我认为,最好的方法是开始一个新的会话。但这取决于您的数据如何到达以及是否保留在工作记忆中。