Drools 规则引擎中 Class 对象问题的迭代列表

Iterating List of Class Objects Issue in Drools Rule Engine

我使用 Kie 学习 Drools Workbench。 我的输入将是 name inside opportunityProduct class 我期待 Ip inside Opportunity class 中的输出。规则引擎执行后,我在输出中只得到空值。

Pojo 结构:

Opportunity.Java :
    private java.lang.Boolean result;
    private java.lang.String ip;
    private java.util.List<com.sample2.sampledemo2.OpportunityProduct> productlist;

OpportunityProduct.Java
    private java.lang.String name;

输入:

{
   "commands":[
      {
         "insert":{
            "out-identifier":"com.sample2.sampledemo2.Opportunity",
            "return-object":true,
            "object":{
               "com.sample2.sampledemo2.Opportunity":{
                  "productlist":[
                     {
                        "name":"abc"
                     }
                  ]
               }
            }
         }
      },
      {
         "fire-all-rules":""
      }
   ]
}

输出:

{
   "type":"SUCCESS",
   "msg":"Container abcdef successfully called.",
   "result":{
      "execution-results":{
         "results":[
            {
               "key":"",
               "value":0
            },
            {
               "key":"com.sample2.sampledemo2.Opportunity",
               "value":{
                  "com..sample2.sampledemo2.Opportunity":{
                     "result":null,
                     "ip":null,
                     "productlist":[
                        {
                           "name":"abc"
                        }
                     ]
                  }
               }
            }
         ],
         "facts":[
            {
               "key":"com.sample2.sampledemo2.Opportunity",
               "value":{
                  "org.drools.core.common.DefaultFactHandle":{
                     "external-form":"0:2:1366747666:1366747666:2:DEFAULT:NON_TRAIT:com.sample2.sampledemo2.Opportunity"
                  }
               }
            }
         ]
      }
   }
}

决定Table:

NAME                  CONDITION                               ACTION

           o:Opportunity(pd: productlist)
             OpportunityProduct
      (name == $param , this memberOf pd)      o.setIp($param);

Origination  "abc"                                  "IPP"

Drl :

rule "Origination"
    when
        o:Opportunity(pd: productlist)
        (OpportunityProduct(name == "abc" , this memberOf pd))
    then
        o.setIp("IPP");
end

我无法确定是我的输入有误还是决策 table 中的条件有误。

在您的输入中,您正在发送要插入的 Opportunity 对象,但您从未插入 OpportunityProduct 事实。您的规则需要这两个事实才能触发。

请记住,在 Drools 中,您只能推理已插入会话中的事实,并且 事实中的嵌套对象本身不是事实

如果您不打算将 OpportunityProduct 作为独立事实插入,您可以做的一件事是使用 from 条件元素来推理不是事实的数据:

rule "Origination"
    when
        o:Opportunity(pd: productlist)
        OpportunityProduct(name == "abc") from pd
    then
        o.setIp("IPP");
end

希望对您有所帮助,

这是因为默认情况下 kie-server rest 接口是这样工作的:

1) 客户端A与B相关(A.b=b)

2) 你先插入A再插入B

3) 在服务器端,每个插入命令都会有:

3.1) 与 B1 实例(未插入)相关的 A 对象(插入到 kie-session 中)

3.2) 另一个B2实例(B1的内容完全复制但与A无关)

这里有两个解决方案:

1) 接受并使用 from

2) 制作您自己的 kie-server 扩展,这就是我所做的 on my open source project to make life easier with drools 。我所有的客户都在使用这种 kie 服务器值得通过反射插入所有 java 连接到顶级对象的对象(大部分时间称为请求)

问候