当使用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请求
{
"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):
{
"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客户端代码是:
public class Message{
public Integer myField;
}。。。
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";。。。
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());
}
}结果:
Commands executed with success! Response:
{
"results" : [ ],
"facts" : [ ]
}我的问题是:我的Java代码中有什么地方是不正确的,所以结果是空的?
谢谢
发布于 2017-03-26 05:16:35
我建议为客户端打开调试日志,以查看发送的请求,并将其与其他请求进行比较,以找出其不正确之处。
对于您的应用程序使用的任何日志记录系统,将此记录器设置为DEBUG (或者将所有内容设置为DEBUG,如果这样对您更好的话):org.kie.server.client.impl.AbstractKieServicesClientImpl
发布于 2018-01-27 01:06:09
如果你想继续使用无状态会话,那么你应该创建一个无状态会话,遵循示例代码:
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中进行配置
发布于 2019-02-27 20:48:18
尝试使用以下命令:
Message m = new Message();
m.myField = 1;
Command<?> insert = commandsFactory.newInsert(m, "Message",true, "DEFAULT"); 这相当于您正在使用的json请求:
"insert": {
"object": {
"Message": {
"myField": 1
}
},
"out-identifier": "Message",
"return-object": true,
"entry-point": "DEFAULT"
}https://stackoverflow.com/questions/42931611
复制相似问题