我正在研究一个项目,在该项目中我们处理不同的文件,对于每个不同的文件,我们需要运行一些从数据库中获取的特定规则。现在,如果我们编译文件的每一行规则,则需要大量时间,因此性能问题。因此,我们所做的是,我们正在编译应用程序启动的所有规则,并创建KieconTainer。但是,我不知道如何根据文件ID执行特定文件规则。你能帮忙吗?
例如,我有2个具有ID 1和2的文件。我有10个规则,其中5个用于文件1,其余5个用于文件2。
使用以下代码,它在两个文件上启动了所有10个规则。
这是我的示例代码:
@Bean
public KieContainer kieContainer() throws IOException {
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kieFileSystem = kieServices.newKieFileSystem();
// To get rules from DB
List<String> rules = loadRules();
int i=0;
for (String file : rules) {
kieFileSystem.write("src/main/resources/rules/" + "a"+i+".drl", kieServices.getResources().newReaderResource(new StringReader(file)));
i++;
}
KieBuilder kieBuilder = kieServices.newKieBuilder(kieFileSystem);
kieBuilder.buildAll();
KieModule kieModule = kieBuilder.getKieModule();
return kieServices.newKieContainer(kieModule.getReleaseId());
}
//当我执行规则
时KieSession kieSession = kieContainer.newKieSession();
kieSession.insert(myObject);
kieSession.fireAllRules();
kieSession.dispose();
将您的规则细分为议程:
agenda-group "a" // or add this to each rule a1, a2,...
rule a1 ...
rule a2 ...
agenda-group "b"
rule b1 ...
rule b2 ...
在呼叫火车之前,您需要决定要使用哪个组并设置焦点:
String group = ...;
kieSession.getAgenda().getAgendaGroup( group ).setFocus();
kieSession.insert(myObject);
kieSession.fireAllRules();