通常情况下,如果企业的业务策略在应用程序中实现的时候,随着业务的发展和策略的不断变化,这种实现方式就会变得越来越复杂、缺少灵活性而造成无法做出快速的反应。而业务规则管理系统 (Business Rule Management System ,BRMS) 的出现,对于应用程序的开发者和业务用户来讲,则提供一种对业务策略的管理更加有效的解决方案。应用业务规则管理系统,开发者和架构师可以在独立于应用逻辑之外去管理业务逻辑,允许业务用户独立于企业的 IT 部门去管理业务策略。与此同时,像 SOA 这样的 IT 架构的出现,使业务逻辑可以在业务规则管理系统中封装成供应用程序和业务流程调用的规则服务。IBM ILOG JRules 就是一个很好的允许业务人员和 IT 开发人员使用的业务规则管理系统,它可以提高业务发展,使业务策略自动化。
在对规则集调用的过程中,根据 XOM 和设计需求,可以采用 POJO、EJB、JMS、Web 服务等调用方式。本文结合场景实例提出了一种基于 Web 服务的调用实现方式,同时,在 ILOG JRules V7.0 的使用指南文档中,也介绍了一种用 JAX-WS 2.1.1 将规则集部署为决策服务的调用方式,如感兴趣,请参见指南 Integrating into an enterprise application部分。本文给出的方案中选用 Axis 创建调用规则集的 Web 服务,调用过程效率高、响应快,编程更加方便、灵活,且能满足 SOA 的架构要求。
ILOG JRules V7.0 通过一组创新模块来创建、管理和部署业务规则,从而实现完善的性能。
ILOG JRules Rule Studio:适用于规则应用程序的集成开发环境 (IDE) 。Rule Studio 直接针对 IDE 的 Eclipse 系列,其中包括 Eclipse IDE。Rule Studio 支持对 ILOG JRules Rule Execution Server 进行规则集调试和部署,还可以通过 Rule Team Server 实现业务规则的编写者之间的协作。
ILOG JRules Execution Server:是一个稳定的与 J2SE 和 J2EE 兼容的可管理的规则执行环境,运行在 Web 服务器或应用程序服务器上。它将规则引擎打包作为一个 Java Connector Architecture(J2C) 资源适配器。Rule Execution Server 包括一个 Web 管理控制台,可以对部署在上面的规则集进行有效的版本控制和管理。Rule Execution Server 与 Rule Studio 和 Rule Team Server 完全集成,可以同时支持开发人员和策略管理者的业务规则部署。
具有下列特性:
易用性好:
在集成了 Eclipse 的环境中工作,通过自动更正和”智能规则”轻松快速地使用与自然语言一致的规则语言编写规则;
使用静态规则分析检测冲突和冗余;
规则流的创建可以进行可视化的组装和拆分,并满足所设计的粒度要求;
可独立于应用逻辑对业务规则应用程序进行快速部署和调试;
管理方便:
通过基于权限的规则访问向业务人员提供控制权的同时,维护应用程序完整性;
通过测试、共同调试和重构进行反复开发;
使用单一界面和规则库管理代码和规则;
同时应对多个发布周期,在准备下一个产品发布的同时维护仍在进行的产品发布;
可控性:
通过受控的执行过程来报告和监控规则;
查看有关所有规则变更和部署地完整历史记录;
在保险或金融等行业解决方案中,如员工的薪水计算或员工的升迁降职处理,都会根据员工的
各项指标和企业管理条例来进行相应的计算和处理,这个过程中就要涉及到大量的业务策略或规则。本文将以员工薪水计算功能中的业务规则应用开发与集成场景为举例,不同的规则决定
不同的薪水计算方式,但由于实际需求中,这些规则又是灵活多变的,因此,把薪水计算的规则提取出来并应用 ILOG JRules 使其在不影响应用程序代码性能的前提下进行独立地快速开发、调试、部署和管理,并以一种 Web 服务的调用方式对其与任意客户端进行集成,是一种非常好的解决方案。
执行对象模型是一种在规则被执行的过程中要基于的一种对象模型。业务规则通过业务对象模型 (BOM) 中的词汇和术语来编写,之后被 ILOG JRules 编译成 ILOG Rule Language(IRL) 语言,在规则的运行状态中,规则引擎可以访问 XOM 中的属性和方法。
在 JRules 中,执行模型的实现方式主要可分为二种,一种是 Java Classes,即 JAVA XOM;另一种是 XML Schema,即 Dynamic Classes。规则引擎访问 XOM 时依据 XOM 的实现方式而采用不同的访问方式。例如,若采用 JAVA XOM,则要将它打包到应用程序端中并随之一起部署,在运行的时候,应用程序的类加载器会使执行环境可以访问它。在不同的情况下,可以根据实际需求来选择 XOM 的设计和实现方式,但 Java 类的实现方式相比之下,更加易用,因为它不仅含有属性,而且类中定义的方法会给业务规则的设计和编写过程带来很大的方便和灵活性。因此,本文中设计 XOM 选择了 Java 类的实现方式,通过自动解析 Java 类,用它的方法和属性来创建业务对象模型 (Business Object Model)。然后就可以通过业务对象模型中所包含的词汇术语来编写规则。
清单 1 为执行对象模型的部分代码,即设计为一个 Java 类,其中类 Agent 的设计在本例中代表员工信息。该类也会定义为规则集的输入和输出参数,当它作为规则集的输入时,它的基本属性中包括了薪水计算规则用到的一些前提条件;在规则的执行过程中,它的一些属性会保存中间变量值;当计算规则执行结束后,它的一些属性值为代表薪水计算的各项结果并被保存,作为输出参数返回到客户端。此类中的方法的灵活之处在于它可以用来计算一些中间变量值或实现一些较为复杂的计算过程等,以提供给业务规则执行时调用 ( 与 XSD Schema 方式相比作用较明显 )。
Public class Agent { |
// 以下属性为计算的前提条件变量(部分)
privateDate onboardDate; // 入司日期
privateString rank; // 职级
private doubleperformanceAmount; // 业绩额
private booleanworkState; // 是否在职
privateString[][] rankHistory; // 职位和时间历史记录
privateDate computationDate; // 计算薪水的日期
. . . . . . |
// 以下为薪水计算规则执行过程中所需的中间变量(部分)
public booleanqualified =false; // 是否有授予某项奖金资格
public intonboardYearNum = -1; // 入司年份
public intonboardMonthNum = -1; // 入司月
public intonboardDayNum = -1; // 入司日
. . . . . . |
// 以下属性为保存计算结果变量
private doublestartupsSubsidy; // 创业津贴
private doublequarterAward; // 个人季度奖金
private double totalAmount; // 薪水总计额度
*设计方法*
// 计算月平均业绩额
public double computeMonthlyAmount(){ . . . . . . } Public double getXXX(){ … } Public double setXXX(){ … } . . . . . . } |
在本例中完成以上工作之后和对规则集的调用之前,还需要依次完成下列主要步骤:
首先在 Rule Studio 中创建一个规则工程,在设计阶段导入 Java Excution Object Model,即 XOM。
然后通过工具解析导入的 XOM 自动创建业务对象模型 (Business Object Model),至此,我们可以看到用来编写业务规则的词汇和术语。
在接下来的业务规则的编写过程中,就可以定义规则分类包,并应用 ILOG JRules 支持的三种自然语言、决策表或决策树的方式直观地对规则进行灵活快速地编写。
定义规则集的输入和输出参数。
在规则流 (ruleflow) 的设计过程中,一个规则集只能定义一个主规则流 (main flow task 属性为 true),它包含规则集执行的入口和出口,但一个规则集可以支持多个子规则流 (main flow task 属性为 false),每一个子规则流又是由执行起点和终点、一条或多条业务规则、判断分支等共同组成,而一个主规则流又可以根据业务规则需要由多个子规则流组装而成。这样的规则流的设计粒度就可以达到我们所要求的粒度,可以对主规则流进行灵活的拆分和组装,非常灵活、方便快捷。
在完成了上述的工作以后,就可以在 Rule Studio 工具中自动创建将规则集打包的规则应用工程 RuleApp,并把它实时部署到 Rule Execution Server 上,之后就可以通过规则路径去调用 RuleApp 中的 Ruleset,同时,通过 Web 权限管理控制台就可以对其进行有效管理。
至此,在本例中已成功完成了业务规则集的开发和部署,也可以在 Rule Studio 中进行调试。
调用过程如图 1 所示:
图 1. 客户端对 ILOG JRules 规则集调用集成模型
在本文给出的调用模型中,需要先将规则应用部署在运行在 Web 服务器中规则执行环境 Rule Execution Server 中。调用的实现过程中,主要先采用 POJO 会话方式对规则集进行本地调用,再将本地调用规则集的 Java 类利用 Axis 发布成 Web 服务,最后在应用程序客户端创建调用此规则服务的代码,即成功实现了以 Web 服务方式调用规则应用的目的,从而实现与客户端的良好集成,这种调用方式效率很高。由于先采用对规则集的本地调用,因此,需要将具有本地调用规则集功能的 Web 服务工程和规则执行环境 Rule Execution Server 部署在相同的 Web 服务器上。
在可管理的规则执行环境 Rule Execution Server 中,规则引擎由 Execution Unit (XU) 来控制,而 Execution Unit(XU) 是一个资源适配器,它能够管理规则引擎,装载规则集,以及在应用程序和规则引擎之间传递数据。XU 处理规则集执行的低层细节,如池和多线程处理,并能提供对资源的访问和管理热部署。应用服务器或应用程序客户机使用 XU 连接规则引擎。
下面给出具有本地调用规则集功能的 Web 服务的工程目录结构,如图 2 所示:
图 2. 调用规则集的 WebService 工程文件目录结构图
在本例中,创建本地调用规则集的 Web 服务工程并将其命名为 IncomeService,从服务发布成功后的目录结构图中,可以清楚看到所需要和生成的各个主要文件。下面对一些重要的文件和代码进行给出示例和说明。
本例中调用规则集的核心类是一个 Java 类,例中名为:ComputeIncomeBean.java;它
获得来自于客户调用服务时的输入参数,在成功调用并执行薪水计算规则集后,获得保存有计算结果的参数 Agent,并将其作为服务的输出参数返回给客户端。
public class ComputeIncomeBean { public Agent computeAgentIncome(Agent agent){ String executionError = null; String rulesetVersion = Messages.getString(“latest”); IlrSessionFactory sessionFactory = null; try { // get a rulesession if (sessionFactory == null) { sessionFactory = new IlrJ2SESessionFactory(); } // Create a session request object IlrSessionRequest sessionRequest = sessionFactory.createRequest(); // rulesetPath=”/ComputeSalaryApp/2.0/ComputeSalary” String rulesetPath = Messages.getString(“rulesetPath”); if (!rulesetVersion.equalsIgnoreCase(Messages.getString(“latest”))) { rulesetPath = rulesetPath + “/” + rulesetVersion; } sessionRequest.setRulesetPath(IlrPath.parsePath(rulesetPath)); // Enable trace to retrieve info on executed rules sessionRequest.setTraceEnabled(true); sessionRequest.getTraceFilter().setInfoAllFilters(true); // Set the input parameters for the execution of the rules Map<String,Object> inputParameters = sessionRequest.getInputParameters(); inputParameters.put(“agent”, agent); IlrStatelessSession session = sessionFactory.createStatelessSession(); // execute and get the response for this request IlrSessionResponse response = session.execute(sessionRequest); IlrExecutionTrace sessionTrace = response.getRulesetExecutionTrace(); agent = (Agent) response.getOutputParameters().get(“agent”); } return agent; } } |
以下文章点击率最高
Loading…