如何以及如何整合Java Webapp + drools + Guvnor?

时间:2012-06-27 09:15:11

标签: java drools drools-guvnor guvnor

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

由于业务经常会出现这些业务规则,我希望业务部门通过GUI对规则进行必要的更改。

我已经Google搜索了整合java网络应用+ Drools + Guvnor,而我却无处可去。

我的问题:

  1. Drools是否支持轻量级GUI来编辑规则?
  2. Drools Guvnor是一个轻量级的GUI,还是有办法让它下台?
  3. 如何轻松地将应用程序集成到Guvnor以阅读规则?
  4. 关于通常简单实现集成Java Application + Drools + Guvnor的任何其他建议都会很棒。

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

2 个答案:

答案 0 :(得分:32)

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

  

由于业务经常会出现这些业务规则,我希望业务部门能够通过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有一些非常好的东西,包括几本书。

总而言之,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

...等等,对于每个规则包,它都清楚地定义了您可以插入哪些响应命令以及它们的作用。在我们的应用程序中运行规则后,我们会根据规则选择插入到会话中的对象并对其进行操作(visitor pattern已证明非常有用,可以避免长if instanceof / {{1 } / else if instanceof链)。

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

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

答案 1 :(得分:2)

上面的答案得到了很好的解释。 但是关于如何整合Java&amp; 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>

希望它也有帮助。