添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

个人博客地址: http://www.ltang.me/2020/10/06/install-drools-workbench-request-server-with-json/

安装Drools workbench

workbench从某个版本开始就改名字叫Business Central了,然而,我们在docker hub上看到的名字仍然是workbench。

参考: https://hub.docker.com/r/jboss/drools-workbench-showcase

docker pull jboss/drools-workbench-showcase
docker run -p 8080:8080 -p 8001:8001 -d --name drools-workbench jboss/drools-workbench-showcase:latest

启动成功后,访问http://ip:port/business-central 即可,默认用户名密码见上面的链接

安装Kie-server

参考:https://hub.docker.com/r/jboss/kie-server-showcase

docker pull jboss/kie-server-showcase
docker run -p 8180:8080 -d --name kie-server --link drools-workbench:kie_wb jboss/kie-server-showcase:latest

默认的用户名密码是kieserver/kieserver1!
注意

docker hub 上的启动命令--link drools-wb:kie-wb实操后发现无法连接上workbench,在workbench页面上找不到启动的kie-server,修改伟--link drools-wb:kie_wb后链接成功。原因暂时没找到…

使用Workbench定义数据对象和规则

这个没什么好说的。定义好数据对象/规则/规则流之后,记得build然后deploy。deploy成功后,可以在Deploy菜单下看到你发布的containers。也可以通过url:http://ip:port/kie-server/services/rest/server/containers看到xml格式的描述。

通过Java Api调用规则

需要注意的是,Person是在Workbench定义的数据对象(DataObject),要么就在项目里面引入workbench发布的jar包,要么就定义一个实体类,包名/类名/变量都需要跟数据对象一致。

   Person person = new Person();
   person.setAge(27);
   person.setBalance(120000.00);
   person.setName("tangliu");
   KieCommands cmdFactory = KieServices.Factory.get().getCommands();
   List<Command<?>> commands = new LinkedList<Command<?>>();
   commands.add(cmdFactory.newInsert(person, "person"));
   commands.add(cmdFactory.newFireAllRules());
   ServiceResponse<ExecutionResults> response = rules.executeCommandsWithResults("com.riskspace:LtangsTestProject:1.0.0", cmdFactory.newBatchExecution(commands));
   System.out.println(JSONObject.toJSON(response.getResult().getValue("person")));

正如上面所说,这样做的缺点就是,我的工程必须依赖发布的规则包里面的数据对象,这可太麻烦了。我想着,能否不需要依赖这些jar包,直接用json的方式调用?

终于在官方的用户手册上找到了调用方式,如下。

Rest api调用规则

通过Http请求,直接使用json作为请求参数,触发规则。代码如下:

        String url = "http://*.*.*.*:8180/kie-server/services/rest/server/containers/instances/testalias";
        String req = "{\n" +
                "  \"commands\": [\n" +
                "    {\n" +
                "      \"insert\": {\n" +
                "        \"out-identifier\": \"person\",\n" +
                "        \"object\": {\n" +
                "          \"com.riskspace.ltangstestproject.Person\": {\n" +
                "            \"name\": \"tangliu\",\n" +
                "            \"age\": 27,\n" +
                "            \"balance\": 120000.00\n" +
                "          }\n" +
                "        }\n" +
                "      }\n" +
                "    },\n" +
                "    {\n" +
                "      \"fire-all-rules\": {\n" +
                "        \"out-identifier\": \"firedActivations\",\n" +
                "        \"agenda-filter\": \"TreeTest_0\"\n" +
                "      }\n" +
                "    }\n" +
                "  ]\n" +
        String body = HttpRequest.post(url).body(req).basicAuth("kieserver", "kieserver1!").execute().body();
        System.out.println(body);

调用是成功了,可惜的是agenda-filter未生效。简单来说就是,fireAll就是真的fire container下所有规则了,不能根据规则名进行过滤。查了下源码,发现如下:

 public Object unmarshal(HierarchicalStreamReader reader,
                                UnmarshallingContext context) {
     String max = null;
      String outIdentifier = null;
      while ( reader.hasMoreChildren() ) {
          reader.moveDown();
          if ( "max".equals( reader.getNodeName() ) ) {
              max = reader.getValue();
          } else if ( "out-identifier".equals( reader.getNodeName() ) ) {
              outIdentifier = reader.getValue();
          } else {
              throw new IllegalArgumentException( "fire-all-rules does not support the child element name=''" + reader.getNodeName() + "' value=" + reader.getValue() + "'" );
          reader.moveUp();
      FireAllRulesCommand cmd;
      if ( max != null ) {
          cmd = new FireAllRulesCommand( Integer.parseInt( max ) );
      } else {
          cmd = new FireAllRulesCommand();
      if ( outIdentifier != null ) {
          cmd.setOutIdentifier(outIdentifier);
      return cmd;

可以看出,fire-all-rules不像它的java同胞,并不支持规则名过滤。找了很多资料,也没找到解决方案,也不知道为什么drools不支持,邮件问了下他们的开发者,可惜还没收到答复。

在rest api的情况下,想要触发指定规则,目前我能找到的解决方案就是,在workbench里面为你想要触发的规则再封装一个规则流,然后在json参数里面,使用

"start-process": { "processId": "example.process", "out-identifier": "firedProcesses"

的方式去触发指定的规则流。

有没有其他解决方案呢?有的,而且从实现上来说并不困难,自己开发一个工程,承担kie-server的功能,简单来说,就是监听workbench发布的规则包,然后将规则包里面的规则加载,同时对外提供一个http接口,将请求参数反序列化成对应的实体对象再去触发规则即可。后面有时间再弄了。

Docker安装drools workbench和kie-server,使用http调用kie-server rest接口传json参数跑规则安装Drools workbench安装Kie-server使用Workbench定义数据对象和规则通过Java Api调用规则Rest api调用规则安装Drools workbenchworkbench从某个版本开始就改名字叫Business Central了,然而,我们在docker hub上看到的名字仍然是workbench。参考: https://hu 组织您的视频、音乐和照片集并将它们流式传输到您的所有屏幕(移动设备、电视/Chromecast、笔记本电脑...)。 如何使用这张图片 建议提供两个可由用户797写入的挂载点(为了安全起见,容器内的plex随机 UID,或者使用--user标志): /config :到某个地方来保存您的 Plex 配置(可以是仅数据容器)。 这将包括您设置的所有媒体列表,海报,收藏和播放列表... /media :到您的一个或多个媒体文件(视频、音频、图像...)。 $ mkdir ~/plex-config $ chown 797:797 -R ~/p kiserver是我们的定义的业务流程和业务规则的执行的地方,他提供执行引擎,来解释执行这些流程和规则 kie-server就是一个war包,可以部署到我们的web服务器上,比如tomcat或者wildfly(Jboss 服务器的As版本,轻装型的),因为JBPM和wildfly本自同根生的缘故,所以默认是wildfly 每个kieserver都有一个Control...
本课程围绕Drools规则引擎官方提供的规则管理平台Workbench(新名称Business Central Workbench)和Kie-Server使用进行讲解。基于WildFly服务器部署WorkbenchKie-Server项目,以及在Workbench中对规则的管理、配置、部署等实战操作。同时,通过实例展示如何通过Java客户端(业务系统)来调用Kie-Server中发布的规则。以上核心内容就是围绕如何在真实环境中使用WorkbenchKie-Server,带你了解一个完成的使用流程。 不仅如此,该课程内容在完成以上核心功能讲解(课程完结)之后,还会长期逐步新增Workbench中大多数组件的讲解介绍,一些应用场景使用的实例,以及业务系统调用的优化等。
https://blog.csdn.net/zhang907743237/article/details/103959531 kie-server workbench 的部署方式有很多,有tomcat(7.1*后停止发布tomcat版本)wildfly 部署 workbench 没什么问题,但是到kie-sever出各种稀奇古怪的毛病,最后使用docker的方式最方便易于使用! 1.docker 安装 首先本地按照docker,windows 需要 企业或专业版本,我用家庭版本,出现...
DST服务器代码变化很大。 我们在上提供了多种变体(标签): latest或vanilla图片更新频率较低,建议日常使用 nightly是每晚构建的映像,因此(希望)随附了最新的服务器代码 steamcmd-rebase工作方式与latest相同,但基于 除nightly以外的所有变体都具有-slim标记的版本,该版本未预先安装DST服务器; 每次启动容器时,都会下载所需的文件。 -slim版本无法离线启动。 除latest版本外,所有其他变体均使用Azure DevOps CI构建。 latest版本是使用Docker Hub的自动构建功能构建的。 Linux x86_64并运行Docker
  为了运行一款软件,我也是拼了。彻底的玩了一次,因为A需要B,我去下载B,结果B又需要C,我去下载C,结果……怎一个艰难了得。最关键的是,目前还没有达到目的!!!   先记录下过程,有时间再来一遍,也许我已经走到了99%呢,就差一点就成功了呢?放弃太可惜! 1) 为了实现一个名叫“规则引擎”的功能,我根据推荐,找到了 drools 这款开源软件 2) drools 的官网为 http://d...
1、将docker容器中的指定文件夹挂载到宿主机上,更新jar包只需上传到宿主机指定路径,方便更新 2、利用bash文件运行jar包,并构建该bash的镜像,代替构建直运行jar包的镜像,利于镜像与jar包解耦。 例如,app-1.0.0.jar 升级到 app-2.0.0.jar,只须更改bash文件的内容,而无须构建新的镜像。 二、准备工作 1、创建存放docker配置文件、jar包的文件夹 在宿主机上,创建文件夹:/home/admin/app,用于存放bash文件和jar包。然 文章出处:https://quguang.wang/post/drools-7.15.0.final-docker-deploy/ 关于drools的相关介绍就不再赘述了,关于drools网上的资料都很少,或者都有些老了,最近折腾了一下,记录下安装部署的过程,希望能节省下大家的时间。 一、快速部署 1.拉取基础镜像,命令如下: docker run -p 8080:8080 -p 8001:... 1. 首先,确保已经安装Docker 并且 Docker 服务正在运行。 2. 打开终端或命令行界面,执行以下命令拉取 Drools WorkbenchDocker 镜像: docker pull jboss/drools-workbench-showcase:latest 3. 完成镜像下载后,执行以下命令运行 Drools Workbench 容器: docker run -p 8080:8080 --name drools-workbench jboss/drools-workbench-showcase:latest 此命令将会在本地端口 8080 上启动 Drools Workbench。 4. 等待容器启动完毕后,使用浏览器访问 `http://localhost:8080/drools-wb`,即可进入 Drools Workbench 的 Web 用户界面。 这样就完成了在 Docker安装 Drools Workbench 的过程。请注意,这只是一个基本的安装过程,请根据实际需求进行适当的配置和调整。 <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-compiler-plugin</artifactId> <configuration> <source>1.8</source> <target>1.8</target> </configuration> </plugin> </plugins> [/code]
Java 读取jar包中的资源文件夹 我遇到的就是通过 URL url = Main.class.getClassLoader().getResource("xml/"); 在linux上 拿到的路径基本上都会在 BOOT-INF 这个文件夹前面加上感叹号,还有 classes 文件夹后面加上感叹号