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

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

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

我已经谷歌搜索集成java Web应用程序+ Drools + Guvnor,我没有得到任何地方。

我的问题:

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

关于通常简单实现集成Java Application + 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有时可能有点稀疏,但网站有一些非常好的东西,包括几本书。

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


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

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

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

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

敢于重构。

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

向他们展示他们需要看到的东西。

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

保护。

我们设计了大多数规则,就像这个伪代码一样:

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

…因此,对于每个规则包,它都清楚地定义了您可以插入的响应命令以及它们的作用。 在我们的应用程序中运行规则之后,我们会根据规则选择插入到会话中的对象并对其进行操作(已certificate访问者模式非常有用, if instanceof / else if instanceof / elseelse if instanceof避免长时间)。

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

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

上面的答案很好地解释了。 但关于如何整合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; }       

希望它也有帮助。