在你的企业级java应用中使用Drools(图)

在你的企业级java应用中使用Drools(图),第1张

什么是Drools Drools 是一个基于Charles Fy s的Rete算法的 专为Java语言所设计的规则引擎 Rete算法应用于面向对象的接口将使基于商业对象的商业规则的表达更为自然 Drools是用Java写的 但能同时运行在Java和 Net上 Drools Drools 被设计为可插入式的语言实现 目前规则能用Java Python和Groovy实现 更为重要的是 Drools提供了声明式程序设计(Declarative Programming) 并且使用域描述语言(Domain Specific Languages (DSL))-专为你的问题域定义了某种模式的Xml 它已经足够灵活到可以用来描述你的问题域 DSLs包含的XML元素(Element)和属性(Attribute)代表了问题域中各种要素 这段时间企业级Java简直能让你睡着 有多少J EE EJB应用程序只是从网页提取数据并把它们存入到数据库中?但开发者真正应该开发和维护的却是他们应用程序中复杂的商业逻辑 这个问题不仅仅适用于将要新应用 而且渐渐地 也适用于那些长期运行的商业核心应用 它们的内部逻辑也需要经常改变 而且往往要求在一个非常短的时间内 在以前的文章中 用Drools让你的商业逻辑使用框架 我介绍了Drools框架 展示了它如何用来组织复杂的商业逻辑 Drool用一组简单的 众所周知的事物替换了许多缠杂的if…then表达式 如果你经历过和商业客户的会议 并为他们提出的想要实现的东西的复杂程度搞得头痛 或许你应该考虑一下像Drools这样的规则引擎了 这篇文章将向你展示如何在企业级Java应用中使用Drools 一路到底的框架 大多数开发者都有自己喜爱的框架 无特定顺序 它们包括表现层框架(Struts JSF Cocoon和Spring) 持久化框架(JDO Hibernate Cayenne and Entity Beans)以及结构框架(EJB 又是Spring Pico和Excalibur) 还有其它很多 每种框架都各有所长 给开发者提供子许多 即开即用 的功能 使用框架来部署应用意味着你避免了许多让人厌烦的细节 让你集中注意力到关键之处 到目前为直 在框架所能做的事中仍然有一个缺口 那就是商业逻辑没有框架 像EJB和Spring这样的工具虽好 但它们却几乎没有提及怎么组织你的那些if …then语句 把Drools加到你的开发工具箱中意味着现在你可以 一路到底 的使用框架来构建你的应用程序 图 显示了这样的一个应用 图 用于Java应用的框架 这篇文章将基于我们已经了解的Drools框架的功能 这些功能可以让我们构建这样的一个应用 ] 我什么时候应该使用规则引擎? 如果你有一把锤子 那所有的东西都看起来都像钉子 这句话在软件工程领域几乎成了陈词滥调了 虽然规则引擎能解决我们的许多问题 但确实值得认真考虑一下规则引擎对我们的企业级Java应用是否合适 需要问的问题有 ● 我的应用程序有多复杂?对于那些只是把数据从数据库中传入传出 并不做更多事情的应用程序 最好不要使用规则引擎 但是 当在Java中有一定量的商业逻辑处理的话 可以考虑Drools的使用 这是因为很多应用随着时间的推移越来越复杂 而Drools可以让你轻松应对这一切 ● 我的应用的生命周期有多久?这个问题的正确答案往往是 令人惊讶的长 ――还记得那些认为他们的程序不会苟活到 年的大型机的程序员吗?使用规则引擎将会在中长期得到好处 像这篇文章所展示的那样 甚至原型都能从Drools与灵活方法的组合中获益 让 原型系统 转化成生产系统 ● 我的应用需要改变吗?唯一能确定的是你的需求将会改变 无论是在开发过程中或是在开发完成以后 Drools使用一个或多个简单易配的XML文件帮你来应对这一切 那么性能呢? 如果你正在写一个企业级应用 很有可能它会扩展到成百(如果不是成千)的用户 你已经知道现有的Java和J EE应用能做到这一点 但一个使用了Drools的应用对这一压力的表现如何?答案是 令人吃惊的好 大多数开发者只是因为不愿 失控 而依赖于他人的代码(比如 某种框架) 想想这个 Drools不仅可以让你的应用和 传统 的编程方法一样快 甚至可以更快 看下面 ● 避免糟糕的代码 Drools引导开发者去做 正确的事 你可以确定你正在写的代码是好的 但你的开发伙伴呢?你可以同样这样说吗?使用框架可以让你更轻松地写出更快 更好的代码 ● 优化过的框架 你有多少次看见商业逻辑重复地从数据库中提取相同的信息 从而降低了整个应用的速度?如果正确使用的话 Drools不仅仅能够记住信息 而且还能记住以往使用该信息进行测试的结果 从而大幅提升应用的速度 ● Rete算法 很多次我们并不是真正需要使用 if 条件 被Drools实现的Rete算法 可以用一个优化的方法替换掉所有的 if…then 表达式 需要重点提及的是 Rete算法在使用更多的内存来降低运行时延迟方面作了折衷 当然这在现代的应用服务器中并不是一个问题 我们也并不推荐你在移动手机上使用Drools! 我们到哪里了? 在我们上一篇文章中 我们写了一个基于Drools引擎的简单的股票交易程序 我们实现了不同的商业规则 展示了我们可以如何迅速地改变规则去适应商业需求 并且JUnit测试给了我们高度自信可以确认系统确实是像我们设想的那样运作的 但是这个应用几乎没有用户介面 而且用硬编码代替了数据库 为了把我们的程序提升到企业级的水平 我们需要增加两个主要的东西 ● 某种用户介面 最理想的是基于标准的Web表现层的框架 ● 一个数据存取对象(DAO)让Drools与数据库(或其它后端)交互 从现有表现框架中实现规则引擎 大多数企业级Java应用是通过Web介面进行交互的 其中最被广泛使用的Web表现层框架是Apache的Struts 理想的结果是 我们写的应用可以从表现层知道它下面的应用层 而不是通过相反的方向 它的好处在于不仅仅可以使我们将来变换其它的表现层(比如Ajax或web service界面) 而且意味着示例代码可以非常容易地应用于其它像Spring的框架 下面的代码片断演示了始何从Web表现层调用商业逻辑(通过规则引擎) 并根据返回结果显示不同的页面 这一例子中 我们使用了一个Struts行为 但其代码是和使用其它表现层框架甚至一个Servlet或一个Jsp页面是很类似的 这个片断使用了struts config xml配置文件 JSP页面来上传/显示数据 并且生成WAR文件来进行布署 片断展示了怎样把规则引擎和web框架集成使用 import javax servlet HttpServletRequestimport javax servlet HttpServletResponseimport apache struts action Actionimport apache struts action ActionFormimport apache struts action ActionForwardimport apache struts action ActionMappingimport BusinessLayer/** * Sample Struts action with Pseudocode * 使用伪代码的Struts行为示例 */public class SampleStrutsAction extends Action{ /**  * Standard Struts doPerfom method* 标准的Struts doPerform方法  */ public ActionForward doPerform(ActionMapping mapping ActionForm form HttpServletRequest request HttpServletResponse response)throws InvalidEntryPointException {//Local Variables//本地变量StockOffer userOffer =null//Get any previous values from the session//从session取得以前的数据userOffer=(StockOffer)request getSession() getAttribute( PREVIOUS_STOCK_OFFER )//create this object if it is null//如为null则创建新对象if (null==userOffer){userOffer = new StockOffer()}//Update with the ining values //用上送的数据更新//These values match those on the form//这些数据是与form中的数据相对应的userOffer setStockName(request getParameterValue( STOCK_NAME ))userOffer setStockPrice(request getParameterValue( STOCK_PRICE ))userOffer setStockQuantity(request getParameterValue( STOCK_QTY ))//Reset the output value//重置输出数据userOffer setRemendPurchase(null)//Call the Business Layer//调用商业层BusinessLayer  evaluateStockPurchase(userOffer)//Forward to the appropriate page //转向合适的页面if ( YES equals(testOffer getRemendPurchase()){return mapping findForward( YES_WEB_PAGE )} //otherwise default to the no page//否则指向无此页面return mapping findForward( NO_WEB_PAGE ) }}这个例子包含了几个东西 经常 我们需要的数据是用户通过好几个网页传来的 因此在这一例子中展示了通过session中的StockOffer对象来保存过去以来的数据 下一步 如果用户改变了一些值 我们更新StockOffer对象 然后我们重置了rmendPurchase标志用以在调用商业逻辑层之前清除以前的结果 最后我们使用商业逻辑层的返回来决定让用户转向哪一页面 在这一例子中 需要注意我们将商业逻辑(买或不买一支股票)与表现层逻辑(决定转向哪一页面)分离开来 这将使我们可以在不同的应用中重用我们的商 lishixinzhi/Article/program/Java/hx/201311/26263

为了更好的在项目中使用Drools,

需要把Drools集成到Spring Boot,

下面介绍集成的方法,

并且开发简单的Demo和测试用例。

pom.xml工程信息:

引入spring-boot-starter-web作为Web工程,对外提供Rest服务,

引入spring-boot-starter-log4j2日志框架,打印测试匹配结果,

引入spring-boot-starter-test测试框架,开发Junt5测试用例:

通过kie-spring引入Drools相关的jar包,

其依赖的spring版本都排除掉,

以上一步的spring boot依赖为准。

启动类DroolsApplication.java:

*** 作的对象Person,

Person.java:

对外提供的Rest服务,

可以对Person对象进行规则匹配,

提供了两个接口,

单个和批量的 *** 作接口:

PersonRuleController.java:

在上面PersonRuleController中需要用到KieContainer,

这个必须在Spring中先初始化才能使用,

相关功能由DroolsAutoConfiguration.java提供:

在DroolsAutoConfiguration中指定了drl规则文件

所在目录rules/com/ai/prd/,

在src/main/resources/rules/com/ai/prd/目录下新建文件

ai-rules.drl:

规则1匹配名字为bob的人,并且调用工具类PersonRuleAction打印相关日志,

同时打印规则的名称和包路径到控制台。

规则2匹配年龄在25到65之间的打工人,

然后把匹配到的人直接打印到控制台。

PersonRuleAction.java在匹配到相应规则时被调用,

此处仅实现日志打印的功能:

在src/main/resources目录下,

新建日志配置文件Log4j2.xml:

日志文件配置后,

PersonRuleAction类打印的日志

不仅会输出到log/rule_result.log,

也会输出到控制台。

针对上面PersonRuleController提供的Rest接口,

开发两个Junit5的测试用例,

在src/test/java/目录下

创建PersonRuleControllerTest.java:

PersonRuleControllerTest执行后,

控制台输出:

cannot be cast to org.drools.compiler.kie.builder.impl.InternalKieModule

大概率是rule规则文件有问题,

格式,中英文字符,语法等问题,

请确保规则文件正确。

可以安装相应插件打开规则文件,

请参考:

Drools的Eclipse_IDEA插件安装

Drools规则引擎 系列教程(一)SpringBoot整合 &快速集成上手

《Drools7.0.0.Final规则引擎教程》之Springboot集成

Drools创建Maven工程


欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/tougao/12044437.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-20
下一篇 2023-05-20

发表评论

登录后才能评论

评论列表(0条)

保存