首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >KIE RuleServicesClient返回空响应

KIE RuleServicesClient返回空响应
EN

Stack Overflow用户
提问于 2017-03-21 23:35:35
回答 3查看 1.2K关注 0票数 0

当使用RuleServiceClient从Java应用程序调用时,我从Drools Execution Server收到了成功但为空的结果,尽管来自Postman的REST调用返回了预期的结果。

我的问题是:我的Java代码中有什么地方是不正确的?

请查看下面的详细信息。

我创建了示例规则(如果字段为Message.MyField == 1,则将此字段设置为400),并能够使用邮递员在KIE Execution Server上启动它:

http://SERVER:8080/kie-server-webc/services/rest/server/containers/instances/kie-container发送POST请求

代码语言:javascript
复制
{
    "lookup": "defaultStatelessKieSession",
    "commands": [{
        "insert": {
            "object": {
                "Message": {
                    "myField": 1
                }
            },
            "disconnected": false,
            "out-identifier": "Message",
            "return-object": true,
            "entry-point": "DEFAULT"
        }
    }, {
        "fire-all-rules": {
            "max": -1,
            "out-identifier": null
        }
    }]
}

响应(请注意"myField": 500):

代码语言:javascript
复制
{
  "type": "SUCCESS",
  "msg": "Container kie-container successfully called.",
  "result": {
    "execution-results": {
      "results": [
        {
          "key": "Message",
          "value": {
            "bnym.test1.Message": {
              "myField": 500
            }
          }
        }
      ],
      "facts": [
        {
          "key": "Message",
          "value": {
            "org.drools.core.common.DefaultFactHandle": {
              "external-form": "0:1:1208207159:1208207159:2:DEFAULT:NON_TRAIT:myProj.test1.Message"
            }
          }
        }
      ]
    }
  }
}

我从教程中借用的Java客户端代码是:

代码语言:javascript
复制
public class Message{
    public Integer myField; 
}

。。。

代码语言:javascript
复制
private static String URL = "http://SERVER:8080/kie-server-webc/services/rest/server";    
private static final String USER = "user";  
private static final String PASSWORD = "pwd";

。。。

代码语言:javascript
复制
public void transform() throws Exception {
    Message m = new Message();
    m.myField = 1;

    KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(URL, USER, PASSWORD);  
    config.setMarshallingFormat(MarshallingFormat.JSON);  
    kieServicesClient = KieServicesFactory.newKieServicesClient(config); 

    RuleServicesClient rulesClient = kieServicesClient.getServicesClient(RuleServicesClient.class);  
    KieCommands commandsFactory = KieServices.Factory.get().getCommands();  

    Command<?> insert = commandsFactory.newInsert(m);  
    Command<?> fireAllRules = commandsFactory.newFireAllRules(); 
    Command<?> batchCommand = commandsFactory.newBatchExecution(Arrays.asList(insert, fireAllRules));  //0
    ServiceResponse<String> executeResponse = rulesClient.executeCommands("kie-container", batchCommand);

    if(executeResponse.getType() == ResponseType.SUCCESS) {  
        System.out.println("Commands executed with success! Response: ");  
        System.out.println(executeResponse.getResult());  
    }
}

结果:

代码语言:javascript
复制
Commands executed with success! Response: 
{
  "results" : [ ],
  "facts" : [ ]
}

我的问题是:我的Java代码中有什么地方是不正确的,所以结果是空的?

谢谢

EN

回答 3

Stack Overflow用户

发布于 2017-03-26 05:16:35

我建议为客户端打开调试日志,以查看发送的请求,并将其与其他请求进行比较,以找出其不正确之处。

对于您的应用程序使用的任何日志记录系统,将此记录器设置为DEBUG (或者将所有内容设置为DEBUG,如果这样对您更好的话):org.kie.server.client.impl.AbstractKieServicesClientImpl

票数 0
EN

Stack Overflow用户

发布于 2018-01-27 01:06:09

如果你想继续使用无状态会话,那么你应该创建一个无状态会话,遵循示例代码:

代码语言:javascript
复制
public static StatelessKieSession getStatelessKieSession() {
    KieServices ks = KieServices.Factory.get();
    KieContainer kContainer = ks.getKieClasspathContainer();
    StatelessKieSession kSession = kContainer.newStatelessKieSession("defaultStatelessKieSession");
    return kSession;
}

public void runRulesStateless(List<Object> objects) {
    getStatelessKieSession().execute(objects);
}

public static void main(String[] args) {
    runRulesStateless(Arrays.asList(new Object[] { new Message() }));
}

如果需要不同的无状态会话,可以在kmodule.xml中进行配置

票数 0
EN

Stack Overflow用户

发布于 2019-02-27 20:48:18

尝试使用以下命令:

代码语言:javascript
复制
Message m = new Message();
m.myField = 1;
Command<?> insert = commandsFactory.newInsert(m,  "Message",true, "DEFAULT"); 

这相当于您正在使用的json请求:

代码语言:javascript
复制
"insert": {
        "object": {
            "Message": {
                "myField": 1
            }
        },
        "out-identifier": "Message",
        "return-object": true,
        "entry-point": "DEFAULT"
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42931611

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档