- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我第一次接触 Drools(使用 java),我对它的 session 和处理对象集合的能力感到非常困惑。情况是这样的:
我正在构建一个由休息服务组成的网络应用程序。
我有一个名为 Log 的类,它有两个字段( eventType 和 RiskLevelId )。
Mycode 在定义的时间范围内从数据库检索多个此类对象。
如果此对象集合恰好包含一个 eventType == 2 且 RiskLevelId == 1 的日志以及另一个 eventType == 3 且 RiskLevelId == 1 的日志,则应执行该规则。
通过 Drools 接口(interface),我正确检索 KieServices、KieBuilder、KieContaier、KieBase 和 KieSession。
try {
// load up the knowledge base
KieServices kieServices = KieServices.Factory.get();
KieFileSystem kfs = kieServices.newKieFileSystem();
FileInputStream fis = f;
kfs.write( "src/main/resources/simple.drl",
kieServices.getResources().newInputStreamResource( fis ) );
KieBuilder kieBuilder = kieServices.newKieBuilder( kfs ).buildAll();
Results results = kieBuilder.getResults();
if( results.hasMessages( Message.Level.ERROR ) ){
System.out.println( results.getMessages() );
throw new IllegalStateException( "### errors ###" );
}
KieContainer kieContainer = kieServices.newKieContainer( kieServices.getRepository().getDefaultReleaseId() );
KieBase kieBase = kieContainer.getKieBase();
kieSession = kieContainer.newKieSession();
}catch (Throwable t) {
t.printStackTrace();
}
然后,我在 for 循环中检索每个单独的 Log istance。留在循环中,我还将对象添加到 KieSession 并触发规则:
@Autowired
KieSessionFactory kieSessionFactory;
@Override
public void run() {
KieSession kieS = kieSessionFactory.getKieSessionCheckSavedLog();
try {
List<Log> logs = logRepo.getAllInGivenTimeSec(10);
for(Log l : logs) {
kieS.insert(l);
kieS.fireAllRules();
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
这是我写的规则:
package com.sample
import it.protodrools.beans.Log;
dialect "java"
rule "log2"
when
$l1 : Log( eventType == 2 && riskLevelId == 1);
$l2 : Log( this != $l1 && eventType == 3 && riskLevelId == 1 );
then
System.out.println( "deadly threat !" );
end
我的问题是:这条规则是否会考虑我传递的整个对象列表(尽管不是通过列表,因为我读过这不是一个好的做法),从而考虑是否存在条件匹配我经过的对象中有一对吗?
您会建议一些不同的解决方法吗?
提前致谢
最佳答案
不,不会。
for(Log l : logs) {
kieS.insert(l);
kieS.fireAllRules();
}
根据您的循环,您将插入一个对象,每次插入后立即触发所有规则。我不确定 Drools 将如何对您的循环使用react,但您可能想要做的是将所有日志插入工作内存中,然后触发规则:
for(Log l : logs) {
kieS.insert(l);
}
kieS.fireAllRules();
设计一个 JUnit 测试类会立即向您展示这一点。
关于java - 如何在多个对象上正确触发 Drools 规则?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56256655/
我是一名优秀的程序员,十分优秀!