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…