java - 将多个同一类的java对象插入到java中的drools中

标签 java drools

我正在尝试流口水。

我遇到过这种情况,我想将同一类的 2 个不同的 java 对象插入到 Drools 中,并在每个规则中使用这两个对象。

例如:

假设我有两个同一类的 java 对象,它们具有几乎相同的变量。

类看起来像这样。

public class Sample{
   Map<String,String> map;
   sample(Map<String,String>map){
      this.map = map;
   }
}

对象:

Map<String,String>map1 = new Map<>();
map1.put("name","james");

Map<String,String>map2 = new Map<>();
map2.put("name","james");
map2.put("id","123k");

Sample obj1 = new Sample(map1);
Sample obj2 = new Sample(map2);

这 2 个对象 obj1,obj2 仅在映射中的键数量不同。

如果我在运行规则之前将这两个对象插入knowledgeSession中,我如何在同一规则中使用这两个对象?如何区分同一规则中的对象,以便我有机会使用这两个对象在规则的when子句中。

插入 session 看起来像这样:

private static StatefulSession sessionObject;
sessionObject.insert(obj1);
sessionObject.insert(obj2);
sessionObject.fireAllRules(1);

如何区分规则中的对象,以便从以下示例代码中 $obj1 接收 object1$obj2 接收 object2

import com.sample.client.Sample;

rule "1"
    when
        $obj1 : Sample()
        $Obj2 : Sample()
        ........
    then
        ........
        ........
end

处理基本数据类型很容易,但是上面这种情况,提取java对象中的map信息来区分对象至关重要,如何处理呢?

最佳答案

如果您不关心哪个对象绑定(bind)到哪个变量,那么您可以这样做:

rule "1"
when
    $obj1 : Sample()
    $obj2 : Sample(this != $obj1)
then

end

如果您确实需要将 $obj1 分配给 obj1 并将 $obj2 分配给 obj2,那么您需要一些东西来唯一地标识您的对象。也许可以向 Sample 类添加 id 属性,或者使用映射中的特定键来指定 id。例如:

rule "1"
when
    $obj1 : Sample(map["id"] == "123k")
    $obj2 : Sample(map["id"] == "456k")
then

end

编辑:

需要注意的是,即使对于 2 个 Sample 事实,第一条规则仍会匹配多次。

希望对你有帮助

关于java - 将多个同一类的java对象插入到java中的drools中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34299239/

相关文章:

java - Google 在 Drools 中收集导入

java - 使用包名称在 Java 中创建对象

java - 请求不包含 Java 文件 uploader 中的 multipart/form-data 或 multipart/mixed 流

java - 删除文件时通知 Apache Camel

java - 如何在 oncreate 之外访问 arraylist

java - 决策表的口水表现

java - 单独的流口水规则还是有更多的结果?

java - 在 Spring MVC 、 Hibernate 、 Oracle 项目中实现规则引擎所需的设计指南

java - 用于检查 +、- 或 * 是否在字符串中的两个单词之间的正则表达式

Drools 在运行时从数据库中获取事实