0

我使用 Kie Workbench 学习 Drools。我的输入将是机会产品类中的名称,我期待机会类中的 Ip 中的输出。规则引擎执行后,我在输出中只得到空值。

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"
                  }
               }
            }
         ]
      }
   }
}

决策表:

NAME                  CONDITION                               ACTION

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

Origination  "abc"                                  "IPP"

博士升 :

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

我无法确定我的输入是否错误或决策表中的条件是否错误。

4

2 回答 2

2

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

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

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

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

希望能帮助到你,

于 2019-02-27T13:15:28.830 回答
0

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

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

2)你插入A然后B

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

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

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

这里有两个解决方案:

1)与它一起生活并使用

2) 制作你自己的 kie-server 扩展,这是我在我的开源项目中所做的,目的是让 drools 让生活更轻松。我所有的客户都在使用这种 kie-server 并通过反射插入连接到顶部对象的所有 java 对象(大多数时候称为请求)

问候

于 2020-02-28T13:40:37.347 回答