在 Web 应用程序中使用 Drools Expert/Flow 的最佳实践
Posted
技术标签:
【中文标题】在 Web 应用程序中使用 Drools Expert/Flow 的最佳实践【英文标题】:Best practices for using Drools Expert/Flow in a Web Application 【发布时间】:2011-04-18 13:46:07 【问题描述】:我目前正在自学 Drools Expert/Flow 以及 GWT。我想使用 Drools Flow 作为事件/命令总线和业务规则引擎来实现应用程序不同部分之间的松散耦合。
到目前为止,我已经从我的测试用例中获得了 Expert 和 Flow 的工作,但是我很难弄清楚如何在 Web 容器中最好地实现 Flow。
我是否应该将所有的脚手架放入无状态会话 EJB 中,让每个请求从头开始设置所有内容,然后运行流程/规则?这对我来说似乎是一种资源浪费。我可以改为存储单个知识会话并在 Web 请求之间共享该会话,同时访问它,该场景是否可以扩展并且它是线程安全的(我的猜测是否定的)?汇集知识会议是个好主意吗?
我要问的基本上是上述是否有任何最佳实践?文档和示例虽然在其他方面非常好,但在这些特定点上并不清楚。
我确实读过一些关于 Drools Grid 的文章,但不确定这是否能解决我的问题,而且似乎正在开发中。如果我的问题不清楚,请直说。
BR 马格努斯
【问题讨论】:
【参考方案1】:知识库是线程安全且重量级的(创建起来并不便宜),因此您可能希望将其保留在应用程序范围内。
目前,大多数人倾向于使用无状态架构并为每个 Web 请求创建 StatelessKnowlegdeSession(线程不安全且创建成本低),例如在无状态会话 bean(或 seam/CDI bean 或 spring bean)中. 但是,如果您拥有有状态 EJB 的强大功能,那么继续使用一个 StafefulKnowlegdeSession 来处理同一对话中的所有请求可能是有益的。
我不确定 StatefulKnowlegdeSession 是否是线程安全的(不这么认为), 所以我提出了一个问题:https://issues.jboss.org/browse/JBRULES-2842
【讨论】:
不幸的是,使用 Drools Flow 隐含意味着我必须使用 StatefulKnowledgeSession,否则 Flow 不起作用。我已经尝试过了,据我记得我得到了一个运行时异常。到目前为止,我能找到的唯一提示是在请求之间保留有关会话的所有数据。我想这归结为该工具的使用模式。也许我在应用 Drools 时遗漏了一些基本的东西。我发现的示例似乎更倾向于桌面应用程序使用 (Swing) 和持续进行的会话。以上是关于在 Web 应用程序中使用 Drools Expert/Flow 的最佳实践的主要内容,如果未能解决你的问题,请参考以下文章
drools 我这边根据需求需要做到可以在web页面随意改动规则..我目前想到的办法是通过java生成drl文件.