您的位置:

java调用ilog规则引擎的简单介绍

本文目录一览:

究竟什么才是真正的规则引擎

可能很多人还不了解规则引擎是什么东西,或者不知道规则引擎究竟有什么用。我们都知道工作流引擎,也听说过JBoss下面有个Drools,或者我们知道 weblogic或者Oracle也有自己的Business Rule,我们可能还听说过ILOG被IBM收购了,如果我们研究微软的WWF,可能也知道其中有RuleSet等内容。国内的一些web快速开发平台,也提到了规则引擎。

在我们的印象中,我们感觉规则引擎就是解决业务逻辑层的实现问题的。因此我们理所当然的觉得工作流中的某个节点的逻辑处理,应该可以用规则引擎来解决,那么工作流本身的逻辑也应该可以由规则引擎来解决。另外我们也会觉得,平时项目当中的业务逻辑应该都可以用规则引擎来解决。

但是当我们在使用上述这些规则引擎,却发现很难和我们实际应用的业务逻辑层的业务逻辑实现相对应。

我们以JBoss的Drools为例,由于其规则引擎使用了匹配规则的方式来进行,因此在应用这些规则引擎时。首先需要将我们具体应用中的业务逻辑做抽象,抽象成一条条规则之后,再打包成一个规则包。一个规则包相当于一个智能块。当数据传递给这个智能块后,系统会以匹配的方式应用满足条件的逻辑处理。

当采用这种方式时,应该说逻辑更抽象了,在一个更高的层次加以抽象化的定义。但是也使得规则引擎的应用得到了很大的限制。

首先这种抽象本身需要一个复杂的分析过程,这需要有很强的分析设计能力。另外我们平时具体应用中的业务逻辑层,大量的逻辑都是对实际数据的处理,很多时候还是一个批量数据的处理,甚至有些逻辑需要的参数我们并不能定义在规则中,而是在数据库表中进行配置。因此我们常见的业务逻辑层的开发,并不能先设计出一个数据模型,然后再在此基础上抽象逻辑。

因此我们发现Drools等规则引擎很难用,根本不是我们所需要的那样。

我们研究规则引擎也有一段时间了。有时候我们发现自己做的规则引擎并不是一个规则引擎。因为我们和像Drools这些规则引擎有很大的差别。但我们确实解决了业务逻辑层的业务逻辑配置问题。应该说我们的更实用一些。但是我们却没法去实现JSR94标准。我们不光处理业务逻辑,还把所有业务逻辑层需要处理的操作全部采用规则配置的形式,包括数据库处理逻辑等。

如何使用 EJB 3.0 调用规则集麻烦告诉我

RES 可作为集中式服务部署,从而响应多个客户机的请求并同时执行多个规则集。它提供的多种规则执行组件,让用户可以选择合适的执行模式,将业务规则管理系统集成到企业应用中。RES 基于模块化的体系结构,使它即可以作为一组 Java SE POJO 对象来部署和运行,又可以在完全兼容 Java EE 的应用程序服务器上部署和运行,它将规则引擎封装为一个 JCA 资源适配器——执行单元 (XU) 资源适配器,在应用程序服务器与规则引擎之间实施 JCA 交互,由 XU 资源适配器来管理规则引擎,加载规则集,并在业务应用和规则引擎间传递业务规则的调用参数和执行结果。图1. RES 组件结构RES 支持如下执行模式:非Jave EE 容器的本地调用:业务应用需要调用 Jave SE 规则执行组件 (ODM 产品安装目录 /executionserver/lib/jrules-res-execution.jar),建立 Java SE 规则会话,来完成业务规则集的调用,并需要将规则执行组件 jrules-res-execution.jar 和业务应用打包在一起部署运行。Jave EE 容器内的非事务处理本地调用:业务应用需要调用 POJO 规则执行组件 (ODM 产品安装目录 /executionserver/applicationservers/appserver/jrules-res-session-appserver.jar),建立 POJO 规则会话,来完成业务规则集的调用,并需要将规则执行组件 jrules-res-session-appserver.jar 和业务应用打包在一起部署运行,并在部署时指定规则执行组件到 XU 的 JNDI 映射。Jave EE 容器内在规则会话上支持事务控制的本地调用:业务应用需要调用 EJB 规则执行组件 (ODM 产品安装目录 /executionserver/applicationservers/appserver/jrules-res-session-ejb3-appserver.jar) 的本地接口,来完成业务规则集的调用,并需要将规则执行组件 jrules-res-session-appserver.jar 和业务应用打包在一起部署运行,并在部署时指定规则执行组件到 XU 的 JNDI 映射。在下一节中,本文将为您详细介绍。Jave EE 容器内在规则会话上支持事务控制的远程调用:业务应用需要调用 EJB 规则执行组件 (ODM 产品安装目录 /executionserver/applicationservers/appserver/jrules-res-session-ejb3-appserver.jar) 的远程接口,来完成业务规则集的调用。在下一节中,本文将为您详细介绍。Jave EE 容器内远程或本地的异步调用:业务应用需要调用基于消息驱动的 MDB 规则执行组件 (ODM 产品安装目录 /executionserver/applicationservers/appserver/jrules-res-session-mdb-appserver.jar),用户需要在运行 RES 的 Jave EE 服务器上安装并配置 MDB 规则执行组件 jrules-res-session-mdb-appserver.jar,并在安装时指定规则执行组件到 XU 的 JNDI 映射。基于Web 服务的远程调用:RES 还支持为规则集生成基于 Web 服务的规则调用服务,通过在 RES 服务器端为规则集生成决策服务,用户可以直接使用 HTTP Request 对规则集进行调用。而通过规则执行组件调用规则集时建立的规则会话状态的不同,业务规则的执行还可以分为有会话状态的规则调用和无会话状态的规则调用:无状态的规则会话:是指在连续两次的规则执行中,规则会话并不保存任何的执行数据和规则引擎状态。在无状态的规则会话中,业务应用通过规则集输入参数将业务对象传递给规则引擎,并将执行结果以规则集输出参数的方式返回给业务应用。无状态的规则会话通常不会直接修改规则引擎的工作内存区。有状态的规则会话:是指为当前规则会话中的规则执行保存规则引擎状态,并提供规则引擎工作内存区的直接访问。在有状态的规则会话中,业务应用既可以通过规则集参数与规则引擎进行业务对象的传递,也可以直接访问规则引擎的工作内存区,向工作内存区插入或提取业务对象。回页首RES session EJB 在 WAS 上的安装和配置如上节所述,在 Java EE 环境中使用 EJB 规则执行组件去调用业务规则集时,您具有以下选项: 使用EJB 规则执行组件的本地接口,用有状态的规则会话或无状态的规则会话,去调用和业务应用运行在同一个 JVM 上的 XU 去执行业务规则集。 使用EJB 规则执行组件的远程接口,用有状态的规则会话或无状态的规则会话,调用运行于远程主机 JVM 上的 XU 去执行业务规则集。而针对这两种不同的调用结构,RES Session EJB 规则执行组件 jrules-res-session-ejb3 的打包和安装配置也有所不同。接下来本文将以 Websphere Application Server (WAS) 为例,向您介绍 jrules-res-session-ejb3 组件的安装和配置。业务规则集 EJB 本地调用的安装配置对于规则集的 EJB 本地调用,需要将业务应用模块和 EJB 规则执行组件 (rules-res-session-ejb3-WAS.jar) 一起打成一个 EAR 包,并在这个 EAR 包的 application.xml 中加入如下 XML 标签 application module web web-uriyour_web_module.war/web-uri context-rootyour_webroot/context-root /web /module module ejbjrules-res-session-ejb3-appserver.jar/ejb /module /application 将打包好的 EAR 安装到运行 RES 的 WAS 服务器上,在安装时选择"详细 - 显示所有安装选项和参数",在安装的第 6 步,可以看到 rules-res-session-ejb3 规则执行组件所包含的两个 EJB: IlrStatelessSessionEJB3 和 IlrStatefulSessionEJB,在这里我们使用默认 JNDI 邦定,直接点击下一步。图2. EJB Bean 邦定在安装的第 7 步我们可以看到 rules-res-session-ejb3 所定义的四个业务接口,在这里我们同样使用业务接口默认的 JNDI 邦定,即直接使用业务接口的名称作为 JNDI 名字,直接点击下一步。图3. EJB 业务接口邦定在安装的第 8 步我们可以看到 rules-res-session-ejb3 所需要映射的资源,即 XU 资源适配器的连接工厂,只有正确定义对 XU 的资源映射,rules-res-session-ejb3 执行组件才在可以在执行时为规则调用建立 EJB 会话。图4. EJB 资源邦定业务规则集 EJB 远程调用的安装配置对于规则集的 EJB 远程调用,需要为业务应用模块生成一个 EJB 规则执行组件 rules-res-session-ejb3 的 Stub,来实现业务对象的序列化和反序列化并与远程 JVM 进行通讯。大多数应用服务器都会提供为 Session EJB 生成 Stub 的功能,以 WAS 为列,可以如下生成 EJB 规则执行组件 jrules-res-session-ejb3 的 stub: WAS 安装目录 /bin/createEJBStubs.bat jrules-res-session-ejb3-WAS7.jar -newfile jrules-res-session-ejb3-WAS7_stub.jar将生成好的 stub 和远程业务应用一起打包,作为规则执行的客户端。在远程的 RES 服务器端,将业务应用所使用的 Java Execution Object Model(XOM) class 和 EJB 规则执行组件 jrules-res-session-ejb3.jar 打包到一起,安装到 RES 运行的 WAS 应用服务器上,安装过程与 EJB 本地调用的安装类似。回页首使用EJB 3 远程和本地调用业务规则集有状态的 EJB 远程调用在调用代码中,首先需要获得一个工厂对象 IlrEJB3SessionFactory 来获取调用所需要的 EJB,如: IlrEJB3SessionFactory factory = new IlrEJB3SessionFactory();然后需要为工厂对象指明执行模式为远程调用,及要使用的业务接口类型为有状态的规则会话,之后就可以使用工厂对象去从远程获取一个有状态的 SessionBean 了,需要注意的是,在创建有状态的 SessionBean 时,一定要将规则集路径 ilrPath 作为第一个参数传递给创建方法,如下: factory.setRemote(true); factory.setStatefulRemoteJndiName( "ilog.rules.res.session.impl.ejb3.IlrStatefulSessionRemote"); IlrStatefulSession statefulsession = factory.createStatefulSession(ilrPath, null, null, false);在获取有状态的 SessionBean statefulsession 对象后,有两种方式向规则集传递参数,调用规则集,一种方式是之间通过 statefulsession 对象直接向规则引擎的工作内存区插入业务对象,如: ListObject objectList = new ArrayListObject(); objectList.add(obj1); objectList.add(obj2); statefulsession.insertJavaObjects(objectList); 一种方式是在执行时,将规则集参数以参数的方式,传递给 statefulsession 对象的 execute 方法,如: HashMapString, Object rulesetParameters = new HashMapString, Object(); rulesetParameters.put("param1", obj1); rulesetParameters.put("param2", obj2); IlrSessionResponse response = statefulsession.execute(rulesetParameters); 无状态的 EJB 远程调用和有状态的 EJB 远程调用一样,首先需要创建一个工厂对象来获取 EJB,然后为工厂对象指明执行模式为远程调用,并指定业务接口的类型为无状态的规则会话,之后就可以从工厂对象获取一个无状态的 SessionBean 了,与获取有状态的 SessionBean 不同,SessionBean 的创建方法不接受任何参数。如: IlrEJB3SessionFactory factory = new IlrEJB3SessionFactory(); factory.setRemote(true); factory.setStatelessRemoteJndiName(" ilog.rules.res.session.impl.ejb3.IlrStatelessSessionRemote"); IlrStatelessSession statelessSession = factory.createStatelessSession(); 对于上面获取的无状态的 SessionBean 对象 statelessSession,其执行方式只有一种,即通过工厂对象创建一个会话请求对象,在会话请求对象中设置规则集执行参数,规则集路径,及执行轨迹等相关信息,并把这个会话请求对象作为参数,传递给 SessionBean 的 execute() 方法,如: IlrSessionRequest request = factory.createRequest(); request.setRulesetPath(IlrPath.parsePath(rulesetPath)); request.setInputParameters(ruleset_params); request.setTraceEnabled(true); IlrSessionResponse response = statelessSession.execute(request); EJB 本地调用和远程调用一样,EJB 规则执行组件的本地调用也分为有状态的本地调用和无状态的本地调用两种方式。除了通过工厂对象创建 SessionBean 的方法略有不同外,本地执行和远程执行的 API 是一样的。对于本地有状态的 EJB 调用,可通过如下方式获取一个有状态的 SessionBean,在获取 SessionBean 对象后,其执行方式与远程的有状态执行一致。 factory = new IlrEJB3SessionFactory(); factory. setStatefulLocalJndiName (" ejblocal:ilog.rules.res.session.impl.ejb3.IlrStatefulSessionLocal"); IlrStatefulSession statefulsession = factory.createStatefulSession(ilrPath, null, null, false); 对于本地无状态的 EJB 调用,可通过如下方式获取一个无状态的 SessionBean,在获取 SessionBean 对象后,其执行方式与远程的无状态执行一致。 factory = new IlrEJB3SessionFactory(); factory.setStatelessLocalJndiName( "ejblocal:ilog.rules.res.session.impl.ejb3.IlrStatelessSessionLocal"); IlrStatelessSession statelessSession = factory.createStatelessSession(); 回页首结束语EJB 规则执行组件作为 RES 的一个重要组成部分,不仅很好的支持了有状态的规则会话和无状态的规则会话执行方式,还可以在传统的规则会话上引入由应用服务器容器提供的事务处理和远程访问功能,更加方便用户将业务规则系统集成到业务应用当中。参考资料 参考WebSphere Operational Decision Management 首页, 查看有关 WebSphere Operational Decision Management 产品的更多信息。

参考WebSphere Operational Decision Management 文档,查看关于 RES 使用的更多信息。

IBM developerWorks 中国,WebSphere 专区:为使用 WebSphere 产品的开发人员准备的技术信息和资料。这里提供产品下载、how-to 信息、支持资源以及免费技术库,包含 2000 多份技术文章、教程、最佳实践、IBM Redbook 和在线产品手册。

IBM developerWorks 软件下载资源中心:IBM developerWorks 最新的软件下载。

加入developerWorks 中文社区:developerWorks 社区是一个面向全球 IT 专业人员,提供博客、书签、wiki、群组、联系、共享和协作等社区功能的专业社交网络社区。

加入IBM 软件下载与技术交流群组,参与在线交流。

IBM developerWorks 工具包:下载关键 WebSphere 最新的产品工具包。

关于作者赵学良 ,IBM 中国软件开发中心软件工程师。自 2008 年起,任职于 IBM Operational Decision Management 团队。关闭[x]关于报告滥用的帮助报告滥用谢谢! 此内容已经标识给管理员注意。关闭[x]关于报告滥用的帮助报告滥用报告滥用提交失败。 请稍后重试。关闭[x]developerWorks:登录IBM ID:需要一个 IBM ID?忘记IBM ID?密码:忘记密码?更改您的密码 保持登录。单击提交则表示您同意developerWorks 的条款和条件。 使用条款 当您初次登录到 developerWorks 时,将会为您创建一份概要信息。您在developerWorks 概要信息中选择公开的信息将公开显示给其他人,但您可以随时修改这些信息的显示状态。您的姓名(除非选择隐藏)和昵称将和您在 developerWorks 发布的内容一同显示。所有提交的信息确保安全。关闭[x]请选择您的昵称:当您初次登录到 developerWorks 时,将会为您创建一份概要信息,您需要指定一个昵称。您的昵称将和您在 developerWorks 发布的内容显示在一起。昵称长度在 3 至 31 个字符之间。 您的昵称在 developerWorks 社区中必须是唯一的,并且出于隐私保护的原因,不能是您的电子邮件地址。昵称:(长度在 3 至 31 个字符之间)单击提交则表示您同意developerWorks 的条款和条件。 使用条款. 所有提交的信息确保安全。为本文评分评论回页首

「规则引擎」是什么?

规则引擎是一个将业务决策从应用程序代码中分离出来,并使用预定义的语义模块编写业务决策的组件,它接受数据输入,解释业务规则,并根据业务规则做出业务决策。”目前有很多规则引擎的软件的,RDE规则引擎和iLog都是比较不错的产品,值得选择。