drools分离式:部署&使用踩坑
一、部署
由于从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-all
、admin
和kie-server
角色的用户,用于WB和kie-server登录:
$ ./add-user.sh -a -u workbench -p workbench! -g admin,kie-server,rest-all
分别重命名两个包为kie-wb.war
和kie-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.war
和kie-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上?
可以是可以,但是有不少问题。
- 由于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,不能是localhost
或127.0.0.1
。
11、构建失败、找不到相关依赖jar?
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
,解析时间开销也不能减少。
作者:localhost01
链接:https://juejin.cn/post/6909271320928714765
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。
关注公众号:程序新视界,一个让你软实力、硬技术同步提升的平台
除非注明,否则均为程序新视界原创文章,转载必须以链接形式标明本文链接