加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

AXIS2学习笔记:开始看源码接收请求创建MessageContext

(2011-12-16 20:37:34)
标签:

axis2

webservice

soap

分类: AXIS2
以WAR方式部署的AXIS2在web.xml里面声明了Servlet
    <servlet>
        <servlet-name>AxisServlet</servlet-name>
        <display-name>Apache-Axis Servlet</display-name>
        <servlet-class>org.apache.axis2.transport.http.AxisServlet</servlet-class>
        <load-on-startup>1</load-on-startup>
    </servlet>
<servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/servlet/AxisServlet</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>*.jws</url-pattern>
    </servlet-mapping>

    <servlet-mapping>
        <servlet-name>AxisServlet</servlet-name>
        <url-pattern>/services/*</url-pattern>
    </servlet-mapping>

/services/*的请求均被映射到org.apache.axis2.transport.http.AxisServlet上,因此从这个类开始看起。
标准的Servlet写法,doPost方法用来处理WebService请求。

protected void doPost(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        response.setBufferSize(BUFFER_SIZE);
        preprocessRequest(request);
        //声明了MessageContext,这个东西是整个消息处理的一条线
        MessageContext msgContext;
        OutputStream out = response.getOutputStream();
        String contentType = request.getContentType();
        //AXIS2支持REST请求,两者处理方式不同
        if (!HTTPTransportUtils.isRESTRequest(contentType)) {
            //处理非REST请求。
            //创建MessageContext了!
            msgContext = createMessageContext(request, response);
            msgContext.setProperty(Constants.Configuration.CONTENT_TYPE, contentType);
           ......
       }else{
           //开始处理REST请求
           if (!disableREST) {
                new RestRequestProcessor(Constants.Configuration.HTTP_METHOD_POST, request, response).processXMLRequest();
            } else {
                showRestDisabledErrorMessage(response);
            }
       }


在红色的一句创建MessageContext,createMessageContext调用方法:protected MessageContext createMessageContext(HttpServletRequest request,HttpServletResponse response,boolean invocationType);invocationType传入的是true。
createMessageContext方法中设定了一堆的属性,比如请求从哪里来,请求哪个地址,请求的协议,类型等等,并且将请求的request对象、response对象和ServletContext对象保存在MC中。在此处并没有对消息做任何处理,消息处理不是transport要做的事情。
使用MessageContext msgContext = configContext.createMessageContext();方法创建了一个空的MC。
public class ConfigurationContext extends AbstractContext {
    public MessageContext createMessageContext() {
        MessageContext msgCtx = new MessageContext(this);
        contextCreated(msgCtx);
        return msgCtx;
    }
}
看上面的代码估计这个创建过程和配置文件系统有关。

在doPost方法中创建并设定了一堆MC 的参数后有这么一句话:

InvocationResponse pi = HTTPTransportUtils.
                        processHTTPPostRequest(msgContext,
                                new BufferedInputStream(request.getInputStream()),
                                bufferedOut,
                                contentType,
                                request.getHeader(HTTPConstants.HEADER_SOAP_ACTION),
                                url);

貌似是在处理消息,传入了和请求消息相关的很多参数。processHTTPPostRequest方法中写道:

 public static InvocationResponse processHTTPPostRequest(MessageContext msgContext,
                                                            InputStream in,
                                                            OutputStream out,
                                                            String contentType,
                                                            String soapActionHeader,
                                                            String requestURI)
            throws AxisFault {
        int soapVersion = VERSION_UNKNOWN;
        try {
            soapVersion = initializeMessageContext(msgContext, soapActionHeader, requestURI, contentType);
            //貌似处理结果最终会放在这个属性里面MessageContext.TRANSPORT_OUT
            msgContext.setProperty(MessageContext.TRANSPORT_OUT, out);

            msgContext.setEnvelope(
                    TransportUtils.createSOAPMessage(
                            msgContext,
                            handleGZip(msgContext, in),
                            contentType));
            //貌似这个方法是让AxisEngine处理这个mc,在前面创建mc的过程中似乎已经将整个配置节点的信息和请求的信息全都存进去了。AxisEngine应该可以利用这些信息来跑phase
            return AxisEngine.receive(msgContext);
        } catch (SOAPProcessingException e) {
            throw AxisFault.makeFault(e);
        } catch (AxisFault e) {
            throw e;
        } catch (IOException e) {
            throw AxisFault.makeFault(e);
        } catch (OMException e) {
            throw AxisFault.makeFault(e);
        } catch (XMLStreamException e) {
            throw AxisFault.makeFault(e);
        } catch (FactoryConfigurationError e) {
            throw AxisFault.makeFault(e);
        } finally {
            if ((msgContext.getEnvelope() == null) && soapVersion != VERSION_SOAP11) {
                msgContext.setEnvelope(OMAbstractFactory.getSOAP12Factory().getDefaultEnvelope());
            }
        }
    }


0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有