15

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

由于这些业务规则通常由业务部门负责,因此我希望业务部门通过 GUI 对规则进行必要的更改。

我在谷歌上搜索了集成 java web 应用程序 + Drools + Guvnor,但我没有得到任何结果。

我的问题:

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

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

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

4

2 回答 2

36

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

由于这些业务规则通常由业务部门负责,因此我希望业务部门通过 GUI 对规则进行必要的更改。

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

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

2. Drools Guvnor 是轻量级的 GUI,还是有办法将其降级?

好吧,“轻量级”是讨论的主题,但 Guvnor 工作得相当好,只需要一个浏览器,所以我认为没关系。

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

好吧,一旦您启动并运行了 Guvnor,连接您的应用程序以使用 aKnowledgeAgent连接到 Guvnor 并侦听新规则更新并不是特别难。

不幸的是,一般的 Drools,特别是 Guvnor 有很多你可能必须解决的怪癖(例如,你必须分解 Guvnor WAR 文件并编辑 WEB-INF/beans.xml 中的文件来设置一个非默认配置...)。但是一旦你把它理顺了,我认为它工作得很好。

至于文档,Javadocs 有时可能有点稀疏,但该网站有一些相当不错的东西,包括几本书。

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


现在,如果您发现自己确实需要 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

...因此,对于每个规则包,它都明确定义了您可以插入哪些响应命令以及它们的作用。在我们的应用程序中运行规则之后,我们会根据规则挑选出插入到会话中的对象并对其进行操作(访问者模式已被证明对于避免长链非常有用)if instanceofelse if instanceofelse

我很高兴我们这样做了,而不是让规则编写者做他们认为他们想对我们的 JPA 对象做的任何事情。

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

于 2012-06-28T20:49:32.483 回答
2

上面的答案很好解释。但是关于如何集成 Java & Drools-Guvnor 如下...

private static KnowledgeBase readKnowledgeBase() throws Exception {
KnowledgeAgent kagent = KnowledgeAgentFactory
        .newKnowledgeAgent( "MortgageAgent" );
kagent.applyChangeSet( ResourceFactory
        .newClassPathResource( "changeset.xml" ) );
KnowledgeBase kbase = kagent.getKnowledgeBase();
kagent.dispose();
return kbase;
}

<?xml version="1.0" encoding="UTF-8"?>
<change-set xmlns='http://drools.org/drools-5.0/change-set'
    xmlns:xs='http://www.w3.org/2001/XMLSchema-instance'
    xs:schemaLocation='http://drools.org/drools-5.0/change-set drools-change-set-5.0.xsd'>
  <add>
    <resource
  source='http://localhost:8080/guvnor-webapp/org.drools.guvnor.Guvnor/package/mortgages/LATEST'
  type='PKG' basicAuthentication='enabled' username='admin' password='admin' />

  </add>
</change-set>

希望它也有帮助。

于 2014-05-08T09:04:01.297 回答