J2EEWeb服務客戶端質量報告(四)
|
客戶端服務軟件包
通過指引WSDL編譯器到應用服務器提供的WSDL上可自動生成客戶端服務軟件包。這個軟件包包含許多類。我們需要修改的唯一類就是客戶端Stub類。同樣地,服務器Web 服務軟件包也包含類Tie,它可將Web服務請求綁定到EJB方法上,客戶端Stub類為每個服務商業方法的每個客戶端配備一個方法。
服務Stub類的名稱為 <ServiceName>ServantInterface_Stub,其中<ServiceName>就是服務名。我們看看類XactServiceServantInterface_Stub 內的submitWork()方法:
| /* * Implementation of submitWork */ public java.lang.String submitWork(java.lang.String string_1) throws java.rmi.RemoteException { try { StreamingSenderState _state = _start(_handlerChain); InternalSOAPMessage _request = _state.getRequest(); _request.setOperationCode(SubmitWork_OPCODE); Xact.XactServiceServantInterface_SubmitWork_RequestStruct _myXactServiceServantInterface_SubmitWork_RequestStruct =new Xact.XactServiceServantInterface_SubmitWork_RequestStruct(); _myXactServiceServantInterface_SubmitWork_RequestStruct.setString_1(string_1); SOAPBlockInfo _bodyBlock = new SOAPBlockInfo(ns1_SubmitWork_SubmitWork_QNAME); _bodyBlock.setValue(_myXactServiceServantInterface_SubmitWork_RequestStruct); _bodyBlock.setSerializer(myXactServiceServantInterface_SubmitWork_RequestStruct_SOAPSerializer); _request.setBody(_bodyBlock); _state.getMessageContext().setProperty(HttpClientTransport.HTTP_SOAPACTION_PROPERTY, ""); Serializer.attachPendingReportToMessage(_state.getMessageContext()); _send((String) _getProperty(ENDPOINT_ADDRESS_PROPERTY), _state); Xact.XactServiceServantInterface_SubmitWork_ResponseStruct _myXactServiceServantInterface_SubmitWork_ResponseStruct = null; Object _responseObj = _state.getResponse().getBody().getValue(); if (_responseObj instanceof SOAPDeserializationState) { _myXactServiceServantInterface_SubmitWork_ResponseStruct = (Xact.XactServiceServantInterface_SubmitWork_ResponseStruct) ((SOAPDeserializationState)_responseObj).getInstance(); } else { _myXactServiceServantInterface_SubmitWork_ResponseStruct =(Xact.XactServiceServantInterface_SubmitWork_ResponseStruct)responseObj; } return _myXactServiceServantInterface_SubmitWork_ResponseStruct .getResult(); } catch (RemoteException e) { // Let this one through unchanged throw e; } catch (JAXRPCException e) { throw new RemoteException(e.getMessage(), e); } catch (Exception e) { if (e instanceof RuntimeException) { throw (RuntimeException)e; } else { throw new RemoteException(e.getMessage(), e); } } } |
在上述的代碼中,我們在_send()之前立即添加了下面的單行:
| Serializer.attachPendingReportToMessage(_state.getMessageContext()); |
如果沒有待解決的客戶端報告需要發送,attachPendingReportToMessage 就返回。否則,它將當前報告連在XML之后并將它當作文本附件添加到SOAP信息中。我們對其他的商業方法也作了同樣的修改,在它們的每個_send()調用之前立即添加了上面的代碼行。