上一节演示了 workbench 的搭建,规则编写、规则测试、规则部署 还通过http使用了部署在kie-server中的规则

下面演示使用java客户端,调用部署在kie-server中的规则。

远程调用kie-server

fact对象

只用到一个Person类,就不配置maven的方式引入fact jar了
直接拷贝到本地项目使用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
package com.myspace.demo01;

/**
 * This class was automatically generated by the data modeler tool.
 */

public class Person implements java.io.Serializable {

    static final long serialVersionUID = 1L;

    private java.lang.Integer age;

    public Person() {
    }

    public java.lang.Integer getAge() {
        return this.age;
    }

    public void setAge(java.lang.Integer age) {
        this.age = age;
    }

    public Person(java.lang.Integer age) {
        this.age = age;
    }
}

发起调用

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52

import com.alibaba.fastjson.JSONObject;
import com.myspace.demo01.Person;
import org.kie.api.KieServices;
import org.kie.api.command.Command;
import org.kie.api.command.KieCommands;
import org.kie.api.runtime.ExecutionResults;
import org.kie.server.api.marshalling.MarshallingFormat;
import org.kie.server.api.model.KieServiceResponse;
import org.kie.server.api.model.ServiceResponse;
import org.kie.server.client.KieServicesConfiguration;
import org.kie.server.client.KieServicesFactory;
import org.kie.server.client.RuleServicesClient;

import java.util.List;

public class KieServerDemo {
    static RuleServicesClient ruleServicesClient;
    static KieCommands commandsFactory;

    static {
        KieServices ks = KieServices.Factory.get();
        commandsFactory = ks.getCommands();

        var serverUrl = "http://192.168.88.3:8180/kie-server/services/rest/server";
        KieServicesConfiguration kieServicesConfiguration = KieServicesFactory
                .newRestConfiguration(serverUrl, "admin", "admin", 10000L);
        kieServicesConfiguration.setMarshallingFormat(MarshallingFormat.JSON);
        ruleServicesClient = KieServicesFactory.newKieServicesClient(kieServicesConfiguration)
                .getServicesClient(RuleServicesClient.class);
    }

    public static void main(String[] args) {
        var kie_container_id = "demo01";
        var p = new Person();
        var oid = "p";
        var commands = List.of(commandsFactory.newInsert(p, oid), commandsFactory.newFireAllRules(), commandsFactory.newDispose());

        Command batchExecutionCommand = commandsFactory.newBatchExecution(commands);
        ServiceResponse<ExecutionResults> executeResponse = ruleServicesClient.executeCommandsWithResults(kie_container_id,
                batchExecutionCommand);

        if (executeResponse.getType() == KieServiceResponse.ResponseType.SUCCESS) {
            Person result = (Person) executeResponse.getResult().getValue(oid);
            System.out.println("调用成功--" + JSONObject.toJSONString(result));
        } else {
            System.out.println("调用失败--" + executeResponse.getMsg());
        }
        System.out.println("done--------");
    }

}

maven仓库的配置

本地在调用远程kie-server时,使用了Person类 那项目该如何依赖该fact类呢?
直接拷贝源码、或下载jar到本地、或以坐标方式引入远程jar等

方案1

fact的jar在workbench节点的maven仓库中
windows本机开发,配置本机maven从workbench节点拉取jar

需要配置两个参数 仓库地址,用户名密码

1
2
3
4
5
<repository>
    <id>drools-m2-repo</id>
    <name>drools-m2-repo</name>
    <url>http://192.168.88.3:8080/business-central/maven2/</url>
</repository>
1
2
3
4
5
<server>
  <id>drools-m2-repo</id>
  <username>admin</username>
  <password>admin</password>
</server>

应配置在项目的pom.xml中
或配置在maven全局配置文件 settings.xml 中

方案2

通常每个公司都有自建的maven私服
那 fact的jar 应发布到maven私服上 同时配置 workbench节点 使用该maven私服
构建部署时,kjar会被发布到该maven私服

查阅drools文档关于 workbench 的配置后
workbench 有两个存储位置 local M2 repository 、Guvnor M2 repository
可通过管理面板的菜单来调整位置( 系统设置 > artifact Repository )
local M2 repository 通常存储路径是 ${user.home}/.m2/ 该版本下docker容器中的位置为 /opt/jboss/.m2/repository
Guvnor M2 repository 由workbench中内嵌的maven仓库 该版本下docker容器中的位置为 /opt/jboss/wildfly/bin/repositories/kie/glob
Guvnor M2 repository 可由系统变量 org.guvnor.m2repo.dir 进行覆盖

分析后感觉没提供 settings.xml 的配置入口
通常的路径 ${user.home}/.m2/settings.xml 这个没测,有可能可行

暴力点的手段 由于项目本身就是maven项目,所以通过git方式把项目拉取下拉 直接修改pom.xml中的配置,达到deploy时推送到指定私服的目的

todo

文档该小节 提到的属性 kie.maven.settings.custom 貌似是针对kjar的
推测该属性或许可与插件kie-maven-plugin https://docs.jboss.org/drools/release/7.28.0.Final/drools-docs/html_single/index.html#_settings_xml_and_remote_repository_setup

kie-server的maven配置

maven的安装目录下: $M2_HOME/conf/settings.xml
用户目录下: ${user.home}/.m2/settings.xml
系统属性指定目录下:kie.maven.settings.custom=/xx/xx/settings.xml

http://localhost:8080/business-central/maven2/ -Dorg.guvnor.m2repo.dir

结论

在工作环境倾向第二种方案

所有项目都是使用公共的共同的私服 fact单独一个jar发布
kjar以坐标方式引入fact-jar 同时也发布到私服上

如果觉着kjar中的规则数据应保密, 也可不发布到私服上