为SOAP/HTTP Web服务编写可靠客户机
作者: Shailesh K. Mishra, 出处:developerWorks 中国, 责任编辑: 叶江,
2007-03-12 13:30
了解如何通过使用 SOAP 消息处理程序来读取和缓存 SOAP 主体,从而为 SOAP/HTTP Web服务编写可靠的客户机……
了解如何通过使用 SOAP 消息处理程序来读取和缓存 SOAP 主体,从而为 SOAP/HTTP Web服务编写可靠的客户机。这种方法在出现服务器故障或网络服务故障等情况下保存准备 Web 服务调用所使用的数据。客户机从 Web 服务获得响应后,可以将此数据从缓存丢弃,否则将使用相同的数据再次调用 Web 服务。
引言
在通常的 Web 服务调用场景中,Web 服务客户机准备调用,并随后调用 Web 服务。如果出现临时系统错误、网络故障或服务不可用,准备调用过程中使用的数据将丢失。可以采用多种方式来保存此数据。一种方法是使用 SOAP 消息处理程序(以下简称处理程序);不过处理程序最常用于进行 SOAP Header 处理。SOAP Header 用于承载请求的上下文数据,例如安全性和事务性之类的服务质量(Quality of Service,QoS)请求。在这些情况下,可以使用处理程序来读取 SOAP 主体。本文将说明如何使用处理程序来缓存主体、如何在出现故障时使用此缓存以及如何编写可靠的 Web 服务客户机。
编写 Web 服务消息处理程序
开发消息处理程序的主要目的是保存准备调用 Web 服务时使用的数据。清单 1 显示了一个消息处理程序,用于在发送请求时读取请求主体。
清单 1. 消息处理程序代码
| package com.ibm.reliablewsclient.ws; import java.util.logging.Logger; import javax.xml.namespace.QName; import javax.xml.rpc.JAXRPCException; import javax.xml.rpc.handler.GenericHandler; import javax.xml.rpc.handler.HandlerInfo; import javax.xml.rpc.handler.MessageContext; import javax.xml.rpc.handler.soap.SOAPMessageContext; import javax.xml.soap.SOAPBody; import javax.xml.soap.SOAPEnvelope; import javax.xml.soap.SOAPMessage; /* * Created on Aug 3, 2006 @author Shailesh K Mishra (shailekm@in.ibm.com) * */ public class ClientHandler extends GenericHandler { private Logger logger; public static SOAPBody body_of_request=null; /** * */ public ClientHandler() { super(); // TODO Auto-generated constructor stub } /* * (non-Javadoc) * * @see javax.xml.rpc.handler.Handler#init(javax.xml.rpc.handler.HandlerInfo) */ public void init(HandlerInfo arg0) { // set up logger logger = Logger.getLogger("com.ibm.reliablewsclient.ws"); super.init(arg0); } /* * (non-Javadoc) * * @see javax.xml.rpc.handler.Handler#getHeaders() */ public QName[] getHeaders() { // TODO Auto-generated method stub return null; } /* * (non-Javadoc) * * @see javax.xml.rpc.handler.Handler#handleRequest(javax.xml.rpc.handler.MessageContext) */ public boolean handleRequest(MessageContext arg0) { try { logger.info("Begin procession ClientHandler.handleRequest"); //generate SOAP body SOAPMessage message = ((SOAPMessageContext) arg0).getMessage(); SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); SOAPBody body = envelope.getBody(); body_of_request=body; logger.info("Request Body : " + body.toString()); logger.info("Completed procesing for ClientHandler.handleRequest"); } catch (Throwable ex) { throw new JAXRPCException("Error in handleRequest", ex); } return true; } /* * (non-Javadoc) * * @see javax.xml.rpc.handler.Handler#handleResponse(javax.xml.rpc.handler.MessageContext) */ public boolean handleResponse(MessageContext arg0) { return true; } } |
清单 1 中的处理程序代码将读取消息主体,并将其赋值给静态变量。此静态 body_of_request 字段用于缓存在准备 Web 服务调用时使用的数据。这是非常简单的缓存技术,但不能扩展。
- 本文关键词:

