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; } } |
在 META-INF 的目录下,创建一个 context.xml 文件,在该文件中添加配置数据源信息。Reloadable 属性如果为 true,则 tomcat 会自动检测应用程序的 /WEB-INF/lib 和 /WEB-INF/classes 目录的变化,自动装载新的应用程序,可以在不重起 tomcat 的情况下改变应用程序。name 表示指定的 JNDI 名称,必须为 jdbc/resdatasource,type 表示数据源类型,使用标准的 javax.sql.DataSource。
<?xml version=’1.0′ encoding=’utf-8′?> <Context reloadable=”true” crossContext=”true”> <Logger className=”org.apache.catalina.logger.FileLogger” prefix=”IncomeService_log” suffix=”.txt” timestamp=”true”/> <ResourceLink name=”jdbc/resdatasource” global=”jdbc/resdatasource” type=”javax.sql.DataSource”/> </Context> |
利用工具将类 ComputeIncomeBean.java 发布成 Web Services,并自动生成 Web 服务描述文件 ComputeIncomeBean.wsdl 和 Web 服务部署描述文件 deploy.wsdd。发布 Web 服务操作如图 3 所示:
创建或修改服务器端配置文件 server-config.wsdd
该文件记录了 axis 已发布的 Web 服务的描述信息。每当部署一个新的 Web 服务时,新服务的描述信息要加入到 server-config.wsdd 中。将 deploy.wsdd 文件中 <service> 标签中的内容(即发布的服务描述信息)拷贝添加到 erver-config.wsdd 文件中。清单 4 展示了拷贝部分的重要代码。
清单 4. server-config.wsdd 文件新增服务描述信息部分源代码示例
<service name=”ComputeIncomeBean” provider=”java:RPC” style=”wrapped” use=”literal”> <parameter name=”wsdlTargetNamespace” value=”http://services”/> <parameter name=”wsdlServiceElement” value=”ComputeIncomeBeanService”/> <parameter name=”schemaQualified” value=”http://services,http://agentbom”/> <parameter name=”wsdlServicePort” value=”ComputeIncomeBean”/> <parameter name=”className” value=”services.ComputeIncomeBean”/> <parameter name=”wsdlPortType” value=”ComputeIncomeBean”/> <parameter name=”typeMappingVersion” value=”1.2″/> <operation xmlns:operNS=”http://services” xmlns:retNS=http://services xmlns:rtns=”http://agentbom” name=”computeAgentIncome” qname=”operNS:computeAgentIncome” returnQName=”retNS:computeAgentIncomeReturn” returnType=”rtns:Agent” soapAction=””> <parameter xmlns:pns=”http://services” xmlns:tns=”http://agentbom” qname=”pns:agent” type=”tns:Agent”/> </operation> <parameter name=”allowedMethods” value=”computeAgentIncome”/> … … <typeMapping xmlns:ns=”http://agentbom” qname=”ns:ExtensionProperty” type=”java:agentbom.ExtensionProperty” serializer=”org.apache.axis.encoding.ser.BeanSerializerFactory” deserializer=”org.apache.axis.encoding.ser.BeanDeserializerFactory” encodingStyle=””/> … … </service> |
同时,要将 XOM 的 Java 类导出,agentbom.jar 文件包放到项目的 lib 库文件中,调用规则引擎的核心代码中要用到此类,并将其作为 Web 服务的参数。同时还要把调用规则引擎时主要用到的 jrules-res-execution.jar 包也放入库中。如图 4 所示
注意,由于服务中对规则集是采用本地调用的方式,因此 Web 服务要与规则应用即 (ComputeSalaryApp) 的运行环境部署在相同的 Web 服务器上。本例中的 Web 服务器采用的是 Tomcat。对 Web 服务工程项目进行导出 WAR 包文件部署在该服务器上如图 5 所示:
部署成功后,可以看到 Web 服务器上部署的应用目录结构如下,如图 6 所示:
之后,点击 Start Sample Server 启动 Web 服务器,可以看到在此服务器上成功部署二项内容:
包含部署了业务规则应用 ComputeSalaryApp 的运行环境 (res.war)。
本地调用业务规则的 Web 服务 IncomeService。
要想在应用程序客户端能够成功地去调用 Web 服务,还需要在客户端创建调用服务的代码。由于在服务成功发布后,我们已经获得了 Web 服务描述文件 ComputeIncomeBean.wsdl,因此,就可以利用工具通过服务描述文件自动生成调用代码。操作如图 7 和图 8 所示:
在客户端工程项目中,自动生成的调用服务的代码文件如图 9 所示:
需要说明的是,工具根据 Web 服务描述文件自动生成的序列化对象 Agent.java 文件,它就代表着员工的信息,可直接作为我们调用服务的输入和返回参数进行使用,实际情况需对该类进行适当的属性设定和方法的修改,从而使它能更加符合作用为参数的要求。因此,可把上述这段调用业务规则服务的代码嵌入到任何客户端应用程序中。
最后,编写测试数据对其进行测试,结果如图 10 所示,结预期结果完全一致。
结束语
本文结合员工薪水计算业务规则应用场景实例,介绍了业务规则开发,部署和集成的主要实现过程。重点讨论 XOM 的设计和给出一种 Web 服务方式调用规则集的集成方案。通过本方案中测试后正确性结果,说明成功的实现了应用 ILOG Jrules 对业务规则地行独立地开发,调试、部署、管理和集成,以及满足 SOA 架构的松耦合的要求。
以下文章点击率最高
Loading…