如何创建;最后一句话;如果没有其他规则触发,Drools中的规则将收回事件?

如何创建;最后一句话;如果没有其他规则触发,Drools中的规则将收回事件?,drools,rule-engine,kie,Drools,Rule Engine,Kie,我有两个规则:一个生成警报消息并将其附加到事件的字符串列表属性(将来将有多个这样的规则),另一个在没有生成警报时收回事件 我使用salience设置规则优先级(“last”规则应该按字面意思是last启动)。但是由于某些原因,规则顺序是错误的,因此警报列表仍然为空,并且所有事件都被收回。请看下面我的样品 main你好。scala import org.json4s_ 导入org.json4s.jackson.Serialization.write 导入org.kie.api.KieService

我有两个规则:一个生成警报消息并将其附加到事件的字符串列表属性(将来将有多个这样的规则),另一个在没有生成警报时收回事件

我使用
salience
设置规则优先级(“last”规则应该按字面意思是last启动)。但是由于某些原因,规则顺序是错误的,因此警报列表仍然为空,并且所有事件都被收回。请看下面我的样品

main你好。scala

import org.json4s_
导入org.json4s.jackson.Serialization.write
导入org.kie.api.KieServices
导入org.kie.api.builder.Message
导入org.kie.internal.io.ResourceFactory
对象main你好{
隐式val格式=默认格式
val事件=列表(
新事件(123L,null,null),
新事件(456L,空,空),
新事件(789L,空,空),
新事件(688723L,null,null),
新事件(12L,空,空),
新事件(13L,null,null))
def main(参数:数组[字符串]):单位={
val kieService=KieServices.get()
val repository=kieService.getRepository
val kfs=kieService.newkieservice
write(ResourceFactory.newClassPathResource(“hello.drl”,this.getClass))
val kb=kieService.newKieBuilder(kfs)
kb.buildAll
if(kb.getResults.hasMessages(Message.Level.ERROR)){
抛出新的RuntimeException(“生成错误:\n”+kb.getResults.toString)
}
val kContainer=kieService.newKieContainer(repository.getDefaultReleaseId)
val session=kContainer.newKieSession()
events.foreach{item=>
println(“输入对象:+写入(项))
val facthandle=session.insert(项目)
session.fireAllRules()
println(“结果对象:+write(session.getObject(facthandle)))
}
}
}
Event.java

import java.util.ArrayList;
导入java.util.List;
公共类事件实现java.io.Serializable{
静态最终长SerialVersionId=1L;
私有java.lang.Long事件\u id;
私有java.lang.String警报;
私有java.util.List警报;
公共活动(){
}
public java.lang.Long getEvent_id(){
返回此.event\u id;
}
public void setEvent_id(java.lang.Long event_id){
this.event\u id=事件\u id;
}
public java.lang.String getAlert(){
返回此.alert;
}
public void setAlert(java.lang.String alert){
如果(警报==null){
alerts=new java.util.ArrayList();
}
警报。添加(警报);
this.alert=警报;
}
public java.util.List getAlerts(){
返回此文件。警报;
}
public void setAlerts(java.util.List警报){
this.alerts=警报;
}
公共事件(java.lang.Long事件\u id、java.lang.String警报、,
java.util.List警报){
this.event\u id=事件\u id;
this.alert=警报;
this.alerts=警报;
}
}
你好。drl

rule "alert"
when
  e: ru.test.Event(event_id == 123)
then
  modify(e) {
    setAlert("alert")
  }
end

rule "Retract" salience -1
when
  e: ru.test.Event (alerts == null || alerts.empty == true)
then
  retract(e);
end
控制台输出

INPUT OBJECT: {"event_id":12,"alert":null,"alerts":null}
result object:  null
INPUT OBJECT: {"event_id":13,"alert":null,"alerts":null}
result object:  null
INPUT OBJECT: {"event_id":123,"alert":null,"alerts":null}  // This object should not be retracted because "123" event_id generates alert
result object:  null
如您所见,所有事件都变为
null

Drools版本为
7.8.0.Final


我做错了什么?谢谢

我不理解这一部分:“……警报列表仍然是空的,所有事件都被撤回。”。这不正是最后一条规则的作用吗?收回警报列表为空的事件?是,但即使警报列表为非空的事件也会收回。我试着用设置一些标志来替换收回,我看到事件中的警报列表已填充,标志已设置。似乎在每个规则的警报列表仍然为空时,都会先执行收回规则。您是否可以在问题中包含用于将事件插入会话和触发规则的代码?你用的是哪种版本的口水?好了,先生。谢谢你的帮助。试着看看你是否能拿出一个完整的测试来证明你的问题。我已经做了一个简单的POC,它正在为我预期的工作。