如何以及是否值得集成 Java Webapp + drools + Guvnor?

2024-03-07

我计划引入 Java 规则,目前正在评估 Drools 以从应用程序中外部化(物理上和逻辑上)业务规则。

由于这些业务规则通常由企业制定,因此我希望企业通过 GUI 对规则进行必要的更改。

我在 Google 上搜索了关于集成 java web 应用程序 + Drools + Guvnor 的信息,但没有得到任何结果。

我的问题:

  1. Drools 是否支持轻量级 GUI 来编辑规则?
  2. Drools Guvnor 是一个轻量级 GUI,还是有办法降低它?
  3. 将应用程序集成到 Guvnor 来读取规则有多容易?

关于集成 Java 应用程序 + Drools + Guvnor 的简单实现的任何其他建议都会很棒。

任何指向教程的指针也可以为我做。


我正在做一些类似于你想做的事情。

由于这些业务规则通常由企业制定,因此我希望企业通过 GUI 对规则进行必要的更改。

警告警告警告!!!这是一个常见的误解,认为只要有 GUI,非程序员就可以使用它。这……不是我得出的结论。它很有帮助,但编程的困难部分不是编写代码,而是针对正确的问题提出良好的解决方案。我确信一些更聪明、更倾向于技术的商业人士可以使用 Guvnor 做一些事情,但不要指望它会成为通往神奇极乐之地的某种黄砖路。您仍然必须为业务人员提供健全的数据模型和 API,让他们可以做他们需要做的事情,但又可以防止他们意外地做他们不想做的事情。

1. Drools是否支持轻量级GUI来编辑规则?

2. Drools Guvnor 是一个轻量级 GUI,还是有办法降低它的性能?

好吧,“轻量级”是讨论的主题,但 Guvnor 工作得相当好,并且只需要浏览器,所以我认为还可以。

3. 将应用程序集成到Guvnor以阅读规则有多容易?

好吧,一旦你启动并运行了 Guvnor,就可以连接你的应用程序以使用KnowledgeAgent连接到 Guvnor 并监听新规则更新并不是特别困难。

不幸的是,Drools 一般来说,特别是 Guvnor 有很多怪癖,您可能必须解决这些怪癖(例如,您必须分解 Guvnor WAR 文件并编辑 WEB-INF/beans.xml 中的文件以设置非默认配置...)。但一旦你弄清楚了这一点,我认为它的效果就很好。

至于文档,Javadocs 有时可能有点稀疏,但是web site http://www.jboss.org/drools/documentation有一些非常好的东西,包括几本书。

总而言之,Drools 和 Guvnor 都是强大的工具,但让它们发挥作用并非易事。如果你真的need他们所提供的东西是值得的,但如果更简单的脚本解决方案就足够了,也可能值得考虑。


现在,如果您发现自己确实需要 Drools,这是我的首要建议 -为您的数据库和规则保留单独的数据模型。这确实意味着需要编写很多无聊的转换代码,但这是非常值得的。

我正在开发的应用程序使用 JPA 来处理数据库事务,并且在我们的规则中使用该数据模型并不是很令人愉快。几个原因:

适合您的数据层的不一定适合 Drools,反之亦然。

我们有一个树结构,在 JPA 中自然是一个@OneToMany与父节点列表中的子节点的关系。在 Drools 中使用列表是相当痛苦的,因此我们将其扁平化为插入一个列表的结构ParentNode对象,以及一堆ChildNode对象,这更容易使用。

敢于重构。

规则的数据模型也需要存在于 Guvnor 内部 - 这意味着如果您重命名实体类或类似的东西,您可能会破坏所有规则。规则的单独数据模型意味着您可以毫无顾虑地重构数据库内容。

向他们展示他们需要看到的内容。

数据库可能变得相当复杂,但规则通常不需要关心其中的许多复杂性。将这些复杂性暴露给编辑规则的人可能会导致很多不必要的混乱。例如,我们发现对于我们的场景,绝对没有必要将规则编写者暴露给多对多关系(事实证明这在 Drools 中处理起来非常复杂) - 因此我们让它们看起来像一对多,一切都变得更加自然。

保护。

我们设计的大多数规则都像下面的伪代码一样工作:

rule "Say hello to user"
when 
  user : User
then
  insert(new ShowMessageCommand("Hello " + user.getName() + "!"))
end

...因此,对于每个规则包,都明确定义了您可以插入哪些响应命令以及它们的作用。在我们的应用程序中运行规则后,我们挑选出规则插入到会话中的对象并对它们进行操作(访客模式 https://secure.wikimedia.org/wikipedia/en/wiki/Visitor_pattern#Java_example事实证明对于避免长时间的使用非常有用if instanceof/else if instanceof/else链)。

我很高兴我们这样做了,而不是让规则编写者为所欲为think他们想要处理我们的 JPA 对象。

无论如何,希望这会有所帮助。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何以及是否值得集成 Java Webapp + drools + Guvnor? 的相关文章

  • 如何使用Spring WebClient进行同步调用?

    Spring Framework in 休息模板 https docs spring io spring framework docs current javadoc api org springframework web client R
  • Guice 忽略注入构造函数参数上的 @Nullable

    我正在使用 Guice v 3 0 并且有一个值被注入到构造函数中 该值可以为 null 因此我在构造函数中使用 Nullable 来自 javax annotations 注释了该参数 public MyClass Parameter1
  • Java 7 默认语言环境

    我刚刚安装了 jre7 我很惊讶地发现我的默认区域设置现在是 en US 对于jre6 它是de CH 与jre7有什么不同 默认区域设置不再是操作系统之一吗 顺便说一句 我使用的是Windows7 谢谢你的回答 编辑 我已经看到了语言环境
  • Android 中的列表(特别是 RecyclerView 和 CardView)如何工作

    请原谅我问这个问题 但我是 Android 开发新手 尽管我正在尝试了解developer android com 网站上的基础知识 但大多数示例 即使他们说它们是为 Android Studio 构建的 尚未设置为使用 Gradle 因此
  • 如何使用 JAVA 代码以编程方式捕获线程转储?

    我想通过 java 代码生成线程转储 我尝试使用 ThreadMXBean 为此 但我没有以正确的格式获得线程转储 因为我们正在使用jstack命令 请任何人提供一些帮助 他们是否有其他方式获取线程转储 使用任何其他 API 我想要的线程转
  • Android 中 localTime 和 localDate 的替代类有哪些? [复制]

    这个问题在这里已经有答案了 我想使用从 android API 获得的长值 该值将日期返回为长值 表示为自纪元以来的毫秒数 我需要使用像 isBefore plusDays isAfter 这样的方法 Cursor managedCurso
  • Android蓝牙java.io.IOException:bt套接字已关闭,读取返回:-1

    我正在尝试编写一个代码 仅连接到运行 Android 5 0 KitKat 的设备上的 目前 唯一配对的设备 无论我尝试了多少方法 我仍然会收到此错误 这是我尝试过的最后一个代码 它似乎完成了我看到人们报告为成功的所有事情 有人能指出我做错
  • 在 Java 中通过 XSLT 分解 XML

    我需要转换具有嵌套 分层 表单结构的大型 XML 文件
  • 用于缓存的 Servlet 过滤器

    我正在创建一个用于缓存的 servlet 过滤器 这个想法是将响应主体缓存到memcached 响应正文由以下方式生成 结果是一个字符串 response getWriter print result 我的问题是 由于响应正文将不加修改地放
  • 在 Clojure 中解压缩 zlib 流

    我有一个二进制文件 其内容由zlib compress在Python上 有没有一种简单的方法可以在Clojure中打开和解压缩它 import zlib import json with open data json zlib wb as
  • JAVA中遍历JSON数据

    我是 JSON 新手 我使用 HTTPUrlConnections 并在 JAVA 程序中获得一些响应 响应数据将类似于 data id 1 userId 1 name ABC modified 2014 12 04 created 201
  • IntelliJ 组织导入

    IntelliJ 是否具有类似于 Eclipse 中的组织导入功能 我拥有的是一个 Java 文件 其中多个类缺少导入 例子 package com test public class Foo public Map map public J
  • 避免 Java 中的重复导入:继承导入?

    有没有办法 继承 导入 Example 常见枚举 public enum Constant ONE TWO THREE 使用此枚举的基类 public class Base protected void register Constant
  • 如何从 Ant 启动聚合 jetty-server JAR?

    背景 免责声明 I have veryJava 经验很少 我们之前在 Ant 构建期间使用了 Jetty 6 的包装版本来处理按需静态内容 JS CSS 图像 HTML 因此我们可以使用 PhantomJS 针对 HTTP 托管环境运行单元
  • 无需登录即可直接从 Alfresco 访问文件/内容

    我的场景是这样的 我有一个使用 ALFRESCO CMS 来显示文件或图像的 Web 应用程序 我正在做的是在 Java servlet 中使用用户名和密码登录 alfresco 并且我可以获得该登录的票证 但我无法使用该票证直接从浏览器访
  • 如何让 Emma 或 Cobertura 与 Maven 一起报告其他模块中源代码的覆盖率?

    我有一个带有 Java 代码的多模块 Maven 设置 我的单元测试在其中一个模块中测试多个模块中的代码 当然 这些模块具有相互依赖性 并且在测试执行之前根据需要编译所有相关模块中的代码 那么 如何获得整个代码库覆盖率的报告 注意 我不是问
  • 禁用 Android 菜单组

    我尝试使用以下代码禁用菜单组 但它不起作用 菜单项仍然启用 你能告诉我出了什么问题吗 资源 菜单 menu xml menu menu
  • 如何在Java中对对象数组进行字段级别排序以进行等级比较?

    In Java Class StudentProgress String Name String Grade CTOR goes here main class main method StudentProgress arrayofObje
  • HttpClient请求设置属性问题

    我使用这个 HttpClient 库玩了一段时间 几周 我想以某种方式将属性设置为请求 不是参数而是属性 在我的 servlet 中 我想使用 Integer inte Integer request getAttribute obj 我不
  • 将对象从手机共享到 Android Wear

    我创建了一个应用程序 在此应用程序中 您拥有包含 2 个字符串 姓名和年龄 和一个位图 头像 的对象 所有内容都保存到 sqlite 数据库中 现在我希望可以在我的智能手表上访问这些对象 所以我想实现的是你可以去启动 启动应用程序并向左和向

随机推荐