一、部署

由于从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"

分别重命名两个包为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

启动WB:

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上?

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

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

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?

drools分离式:部署&使用踩坑插图

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都需要输入密码,填写如下:

使用SSH方式的话,需要配置SSH密钥,可以生成SSH公私钥后,公钥上传到如图:

drools分离式:部署&使用踩坑插图1

我这边使用SSH发现,无法远程使用SSH,提示bad file number,只能localhost访问,故慎用!

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

drools分离式:部署&使用踩坑插图2

此时可以先看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上设置白名单:

drools分离式:部署&使用踩坑插图3

但是有时设置后仍然无效,这应该是是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,解析时间开销也不能减少。
作者:localhost01
链接:https://juejin.cn/post/6909271320928714765
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。



drools分离式:部署&使用踩坑插图4

关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台

除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接

本文链接:http://www.choupangxia.com/2022/07/14/drools-4/