由于从drools7.11版本开始,就没有tomcat版本的Business Central Workbench包了(后续简称WB),所以为了后续的迭代升级,我们使用它的推荐Web容器—wildfly(前身是jboss as)!

1、下载相关组件

  • drools官网下载: Business Central Workbench ,使用 business-central-7.44.0.Final-wildfly19.war
  • drools官网下载: KIE Execution Server ,使用 kie-server-7.44.0.Final-ee7.war (kie server是tomcat和* wildfly都支持的,如需部署到tomcat,则使用 kie-server-7.44.0.Final-webc.war );
  • 下载wildfly19+(我下的wildfly21)
  • 注意: WB和KIE Execution Server的版本要匹配

    2、安装配置git和maven

    git和maven的安装方法就不多说了,正常安装,注意配置好环境变量即可。

    另外注意C盘 .m2文件夹下 setting.xml 配置好,WB会自动读取该配置文件,在构建程序和部署时会自动去指定私服下载相关依赖。

    3、部署到wildfly

    建议是使用两个不同的wildfly来分开部署两个东西,原因见下面的 FAQ-2

    wildfly有两种部署模式,一个是 standalone ,一个是 domain ,前者主要是单机简单部署,后缀是分布式集群部署,我们选择前者。

    wildfly解压后,进入bin,为Kie-Server添加一个具有 kie-server 角色的用户:

    $ ./add-user.sh -a -u kieserver -p kieserver1! -g kie-server
    

    为Business Central添加一个具有rest-alladminkie-server角色的用户,用于WB和kie-server登录:

    $ ./add-user.sh -a -u workbench -p workbench! -g admin,kie-server,rest-all
    

    分别重命名两个包为kie-wb.warkie-server.war,分别复制到不同wildfly的standalone/deployments目录下;

    增大wildfly启动内存metaspace大小,否则可能内存溢出。修改standalone.conf.bat文件:

    set "JAVA_OPTS=-Xms512M -Xmx3G -XX:MetaspaceSize=512M -XX:MaxMetaspaceSize=1024M -Dfile.encoding=UTF-8"
    

    修改两台wildfly启动配置文件 standalone-full.xml,使得支持远程访问:

     <interfaces>
         <interface name="any">
         <any-address/>
     </interface>
     <interface name="management">
         <inet-address value="${jboss.bind.address.management:0.0.0.0}"/>
     </interface>
     <interface name="public">
         <inet-address value="${jboss.bind.address:0.0.0.0}"/>
     </interface>
     <interface name="unsecure">
         <inet-address value="${jboss.bind.address.unsecure:0.0.0.0}"/>
     </interface>
     </interfaces>
    

    修改Kie-Server的这台wildfly,将所有端口减少50(防止两台wildfly端口冲突)

    <!--重点就是这儿的port-offset--->
    <socket-binding-group name="standard-sockets" default-interface="public" port-offset="${jboss.socket.binding.port-offset:-50}"> 
    

    环境变量新增两个JBOSS_HOME: 同时修改wildfly-21.0.0Final-2/bin/standalone.bat,将里面的JBOSS_HOME字符串统一替换为JBOSS_HOME2

    standalone.bat -c standalone-full.xml
    

    启动kie-server

    standalone.bat -c standalone-full.xml -Dorg.kie.server.id=my-kie-server -Dorg.kie.server.location=http://192.168.120.175:8030/kie-server/services/rest/server -Dorg.kie.server.controller=http://192.168.120.175:8080/kie-wb/rest/controller
    

    二、FAQ

    1、使用哪个版本的drools?

    之前尝试过7.10,但是发现tomcat方式部署后经常出现会话过期,需要重新登录的情况,时间关系,没有去定位到根本原因。因此换用了7.44.0,该版本属于一个最新版,安装后比较稳定。

    2、workbench和kie-sever部署到一个wildfly上?

    可以是可以,但是有不少问题。

  • 由于workbench与kie-server在同一个wildfly上,权限管理很不好做;
  • 部署在同一台之后,kie-sever会启动两个实例(一个是server@localhost,一个是你指定IP的server@ip),而server@localhost远程访问界面控制台报错(根据localhost域名找不到某些文件)
  • 3、启动报内存溢出?

    上面步骤有涉及解决方案。注意,除了调整堆内存,还调整了metaspacesize,因为启动发现metaspace内存溢出,原因猜测应该是WB包中jsp、class等文件过多,导致编译为class加载到metaspace装不下!

    4、drools中文乱码?

    上面步骤有涉及解决方案。注意,是需要在standalone.conf.bat文件增加-Dfile.encoding=UTF-8,实验发现在standalone.bat启动参数增加-Dfile.encoding无效,虽然使用System.getProperty("file.encoding")打印看起来是生效的,但实际还是未生效!

    5、使用WB的knowledge store rest api时,发现401没权限

    上面步骤有涉及解决方案。注意,步骤中相比网上多了一个rest-all角色,该角色用于使用knowledge store rest api(直白说就是通过该api操作WB的git仓库的api)。

    6、kie-server可以本地访问,无法远程访问?

    上面步骤有涉及解决方案。修改部署WB的wildfly启动配置文件 standalone-full.xml即可。

    7、两个wildfly同时启动,端口冲突?

    上面步骤有涉及解决方案。

    8、启动出现 operation add-deployer-chains at address [] failed -- java.util.concurrent.TimeoutException: java.util.concurrent.TimeoutException 等超时问题,然后应用启动失败?

    启动参数必须加 -c standalone-full.xml,表示启用wildfly完整功能。

    9、两个wildfly启动一直报端口冲突?

    上面步骤有涉及解决方案。必须环境变量新增两个JBOSS_HOME,不同的wildfly用不同的JBOSS_HOME,否则两个wildfly实际上都是用的同一个wildfly。

    10、远程无法访问kie-server?

    上面步骤有涉及解决方案。kie-server的启动参数ip,不能是localhost127.0.0.1

    11、构建失败、找不到相关依赖jar?

    安装配置好maven之后,这里会看到对应的仓库地址和本地仓库地址

    12、Kie-Server的API哪儿看?

    部署好之后,是有对应swigger地址的:http://192.168.120.175:8030/kie-server/docs

  • KIE Server and KIE containers 提供Kie-Server相关KieContainner的增删改查等功能
  • KIE session assets 提供规则的调用
  • 13、WB的knowledge store rest api哪儿看?

    http://192.168.120.175:8080/kie-wb/docs/#/这个只有关于kie-server的相关api,而knowledge store rest api只有去官网文档 16. Business Central integration 里面可以看到。

    但是如果我们直接使用WB的git仓库,本地idea进行代码管理,则根本不需要knowledge store rest api,这也是我这边正在这样做的方式。

    14、WB的MAVEN仓库、git仓库地址在哪儿?

  • MAVEN仓库磁盘地址:wildfly-21.0.0.Final\bin\repositories\kie\,这里保存所有构建好的kjar; 对应的http地址:http://192.168.120.175:8080/kie-wb/rest/maven2/com/myspace/Test/1.0.0-SNAPSHOT/Test-1.0.0-20201027.112404-25.jar
  • GIT仓库磁盘地址:wildfly-21.0.0.Final\bin\.niogit 对应的http地址:http://192.168.120.175:8080/kie-wb/rest/spaces
  • 15、项目如何拉下WB的git项目,进行WB在线+本地idea的同时开发维护?

    根据http://192.168.120.175:8080/kie-wb/rest/spaces返回的结果,找到对应SSH地址或HTTP地址,进行git clone!

    Trips:使用HTTP方式的话,可以在小乌龟→设置→Git→凭证,加一个,防止每次pull、push都需要输入密码,填写如下:

  • URL:http://192.168.120.175:8080/kie-wb/git/MySpace/Test //你的git项目地址
  • 助手:wincred
  • 用户名称:workbench //git、maven等验证都统一是使用的WB账号密码验证
  • 勾选使用HTTP组件
  • 使用SSH方式的话,需要配置SSH密钥,可以生成SSH公私钥后,公钥上传到如图: 我这边使用SSH发现,无法远程使用SSH,提示bad file number,只能localhost访问,故慎用!

    16、WB的git仓库,使用SSH方式只能本地拉取,无法使用本机局域网IP和远程去拉取?

    此时可以先看WB界面上,URL这里显示的会是ssh://localhost:8001/MySpace/Test(上图是我后面配置正常后的截图)

    此时需要添加启动参数,以通知WB使用本地局域网IP替换默认的localhost:

    -Dorg.uberfire.nio.git.http.hostname=192.168.120.175    //HTTP的也可以配置一下,配置后界面就会展示局域网IP(强迫症必做),虽然HTTP本来就可以用
    -Dorg.uberfire.nio.git.ssh.hostname=192.168.120.175     //配置后界面展示的地址将会改为这个
    -Dorg.uberfire.nio.git.ssh.host=192.168.120.175   //实际生效的是这个配置
    

    17、官方说使用eclipse进行drools开发,idea怎么办?

    实际上,目前idea(我的版本是2020.1)已经完美支持drools的各种智能提示、语法检查、ctrl跳转等,也就相当于编写drl文件就和写java代码一样,只是没有携带drools引擎那一套。

    18、kie-sever不支持agenda-filter(只运行指定规则名)?

    是的,虽然kie-server-client.jar封装有相关agenda-filter,但kie-server不支持该功能(规则引擎本身是支持的),所以建议尽量将规则封装为不同kjar,然后使用不同KieContainner进行包装运行,即通过指定不同KieContainnerId来达到运行不同规则的目的。

    19、如何自定义maven和git仓库?

    在WB启动参数增加:-Dorg.guvnor.project.m2repo.dir-Dkie.maven.setting.custom(kie-server) 和-Dorg.uberfire.nio.git.dir-Dorg.uberfire.nio.git.dirname(文件夹名称)

    20、kie-server一直无法注册到workbench,控制台一直报403等问题?

    基本这类问题都是权限问题,workbench对于kie-server的注册请求,会进行权限认证,默认会看kie-server的用户名是否是kieserver/kieserver1!,如果你创建kie-server用户时使用了其他名字,则可能导致认证失败。

    解决方法为,可以在WB启动参数加:

    -Dorg.kie.workbench.controller.user=你设定的kie-server用户名 
    -Dorg.kie.workbench.controller.pwd=你设定的kie-server用户密码
    

    另外,还有一种情况是,你之前修改过账号密码,然后后续就一直连接报405,wireshark抓包发现,kie-server发出认证仍然用的是之前的账号密码,这时,需要到wildfly的bin目录下,找到my-kie-server.xml文件,将里面的对应账号密码修改即可!

    21、【偶发性】启动WB卡很久,然后报Timeout after [300] seconds waiting for services container stablility. 最后启动失败?

    原因不详,目前可以将改超时时间增大,失败后,就再次重启。启动参数增加:

    -Djboss.as.management.blocking.timeout=600  //默认是300(秒)
    

    22、本地拉下git项目后,缺少javax.persistence?

    需pom.xml增加:

    <dependency>
          <groupId>javax.persistence</groupId>
          <artifactId>javax.persistence-api</artifactId>
          <version>2.2</version>
    </dependency>
    

    注意,依赖不是eclipse的javax.persistence那个jar,那个会导致WB打开Data Objects报错,提示没有权限访问persistence的相关class!

    23、WB构建项目是,出现大量警告 Verification of class xxx failed and will not be available for authoring. Underlying system error is: xxx. Please check the necessary external dependencies for this project are configured correctly.

    WB所做的是从项目的依赖关系扫描所有类(主要是扫描Data Objects),并验证他们是否可用于drools规则创作(扫描可用的会在编辑Data Objects时,在左侧栏展示出来)。而这个警告的意思是,相关类不可用于规则编辑器之类的创作工作。如log日志打印的依赖,就会报出大量这类警告,他们不可用于规则创作。

    这时我们可以将其在WB上设置白名单: 但是有时设置后仍然无效,这应该是是WB的偶发性系统bug。

    这时可以点开项目根目录的package-names-white-list,在里面添加相关白名单类(注意是全路径),如com.myspace

  • 默认情况下,会加载该规则项目的所有三方依赖中的类,而一旦设置后,表示只加载设置的哪些类
  • 可使用通配符方式,如com.myspace.*
  • 24、WB项目不允许使用lombok?

    是的,否则在控制台编辑时会抛出异常,同时无法打开文件。

    25、使用kie-server-client方式,调用远程返回结果一直为空?

    一般可能是调用kieHelper.newInsert()方法时没有传入ID。图下是正确调用代码:

    //1、创建kie相关调用组件
    KieServicesConfiguration config = KieServicesFactory.newRestConfiguration(SERVER_URL, SERVER_USER, SERVER_PASS, 10000L);
    config.setMarshallingFormat(MarshallingFormat.JSON);
    RuleServicesClient client = KieServicesFactory.newKieServicesClient(config).getServicesClient(RuleServicesClient.class);
    KieCommands kieHelper = KieServices.Factory.get().getCommands();
    List<Command> commands = new LinkedList<>();
    //2、将数据组装调用kie-server规则引擎
    List<User> users = UserServices.getAllUserList();
    for (User user : users ) {
        //这儿一定要写上第二个参数,也就是out-identifier,否则无法返回,同时批量插入多个数据时,这个out-identifier不能相同,否则会覆盖。
        commands.add(kieHelper.newInsert(user, user.getId()));  
    commands.add(kieHelper.newFireAllRules());
    ServiceResponse responses = client.executeCommandsWithResults(KIE_CONTAINER_ID, kieHelper.newBatchExecution(commands));
    Map<String, Object> response = ((ExecutionResultImpl) responses.getResult()).getResults();
    for (Map.Entry entry : response.entrySet()) {
        System.out.println("id:" + entry.getKey() + ", 结果:" + GsonUtils.toGson(entry.getValue()));
    

    26、WB无法下载maven仓库三方依赖,且一直报could not find artifact xxxxx

    检查是否正确配置maven,且.m2/setting.xml(默认)配置的地址是否正常,另外检查是否使用了 kie.maven.offline.force=true,则表示关闭maven仓库拉取。

    27、【巨坑】规则项目复杂起来之后,每次WB上buid&install或者打开文件巨慢,10分钟以上

    以上情况基本就告别WB了,其实WB的定位是解决一些风控、金融等项目的业务场景。

    它实际每个规则文件或者规则项目应该都不会很大,基本由规则文件+JavaBean构成。

    但是如果你的规则项目使用太多的三方依赖、做了很多复杂的工作。那么在WB上进行依赖解析时,会花费巨量时间,尽管你设置了package-names-white-list,解析时间开销也不能减少。

    我这边就遇到这个问题,是真的被整累了~!

    如果喜欢本文,请关注公众号:开猿笔记,里面会有持续更新噢!

    分类:
    后端
    标签: