| SCA中Web Service的發(fā)布及調用分析 在SCA規范中提供了Web Service Binding,可以把服務(wù)對外暴露為Web Service,同時(shí)也可以消費外部提供的Web Service服務(wù),這一功能在EOS中是如何實(shí)現的呢,下面分兩部分進(jìn)行詳細的說(shuō)明(在EOS當中,Web Service容器采用axis2來(lái)完成)。
一、對外暴露為Web Service 把服務(wù)對外暴露為Web Service,通過(guò)在Service上添加binding.ws節點(diǎn)來(lái)實(shí)現。在服務(wù)端解析構件的服務(wù)時(shí),解析器發(fā)現有Web Service Binding,則其處理過(guò)程如下: 1、根據服務(wù)的接口類(lèi)型生成axis2對象AxisService,在其中分為兩種情況 (a) 接口類(lèi)型為WSDL定義的接口,則會(huì )利用其對應的WSDL文件對應的Definition對象生成,在此主要用到了axis2提供的WSDLToAxisServiceBuilder.populateService()方法來(lái)完成。 (b) 接口類(lèi)型采用Java接口進(jìn)行描述,則會(huì )利用接口提供的Java類(lèi)生成,在此主要通過(guò)增加Parameter參數來(lái)完成,代碼樣例如下: AxisService axisService = new AxisService(); Parameter classParam = new Parameter(Constants.SERVICE_CLASS, "interfaceName"); axisService.addParameter(classParam); 2、接管Web Service允許調用的操作 (a) 針對AxisService中定義的所有操作AxisOperation,定義其接管的業(yè)務(wù)方法處理,這通過(guò)設置AxisOperation的MessageReceiver來(lái)完成。 (b) 擴展axis2中的抽象類(lèi)AbstractInMessageReceiver,實(shí)現抽象方法invokeBusinessLogic來(lái)完成業(yè)務(wù)操作的調用。 3、把生成的AxisService對象加入到axis2的配置上下文中 (a) 根據配置文件axis2.xml生成AxisConfiguration對象 (b) 利用生成的AxisConfiguration對象,建立配置上下文ConfigurationContext (c) AxisConfiguration對象中添加生成的AxisService 4、建立Axis2ServiceServlet,監聽(tīng)請求 (a) 新建對象Axis2ServiceServlet servlet = new Axis2ServiceServlet(); (b) 利用上下文對Servlet初始化servlet.init(configContext); (c) 設置上下文的URL,也就是要監聽(tīng)的URL。configContext.setContextRoot(servletURI); 經(jīng)過(guò)以上步驟,服務(wù)端針對每個(gè)URL都生成了一個(gè)AxisServlet監聽(tīng)客戶(hù)的請求,每個(gè)請求的參數都以OMelement類(lèi)型進(jìn)行了封裝。 服務(wù)調用的序列圖如下:
二、引用外部的Web Service 在構件中可以通過(guò)引用調用外部的服務(wù),如要引用外部的Web Service,在引用(reference)節點(diǎn)上添加binding.ws來(lái)實(shí)現,通過(guò)屬性wsdlElement指定引用外部Web Service的address。其處理過(guò)程如下: 1、 針對每個(gè)reference調用,生成一個(gè)axisClient, (a) 根據wsdlElement屬性值,找到對應的WSDL,生成AxisService(步驟同上1(a))。 (b) 生成axis的配置上下文(步驟同上(3))。 (c) 生成Axis調用客戶(hù)端ServiceClient client = ServiceClient(configContext, axisService); 2、 調用時(shí),解析傳入的Message,發(fā)送請求 (a) 根據要調用的操作,生成OperationClient,方式為ServiceClient.createClient(wsdlOperationName) (b) 解析傳入的OMelement Message,生成SOAPEnvelope。把Message中的值添加到SOAPEnvelope的Body當中,進(jìn)行數據傳遞。 (c)生成傳遞信息上下文MessageContext (i) 生成MessageContext,并設置其信封,MessageContext.setEnvelope(SOAPEnvelope);。 (ii) 設置調用服務(wù)器的Endpoint MessageContext. .setTo(new EndpointReference("address")); (iii) 把生成的信息上下文MessageContext添加到OperationClient當中 operationClient.addMessageContext(MessageContext); (d)發(fā)起請求 operationClient.execute(true); 3、 返回調用結果,從返回的SOAP信息中取得結果值 MessageContext responseMC = operationClient.getMessageContext("In"); OMElement response = responseMC.getEnvelope().getBody().getFirstElement(); 經(jīng)過(guò)上述步驟,就完成了一個(gè)完整的Web Service客戶(hù)端的調用,其序列圖如下: ![]() |
| 4月28日 9:54:39 |
聯(lián)系客服