SCA中Web Service的发布及调用分析

SCA规范中提供了Web Service Binding,可以把服务对外暴露为Web Service,同时也可以消费外部提供的Web Service服务,这一功能在EOS中是如何实现的呢,下面分两部分进行详细的说明(在EOS当中,Web Service容器采用axis2来完成)。

 

一、对外暴露为Web Service

 把服务对外暴露为Web Service,通过在Service上添加binding.ws节点来实现。在服务端解析构件的服务时,解析器发现有Web Service Binding,则其处理过程如下:

1、根据服务的接口类型生成axis2对象AxisService,在其中分为两种情况

      (a)    接口类型为WSDL定义的接口,则会利用其对应的WSDL文件对应的Definition对象生成,在此主要用到了axis2提供的WSDLToAxisServiceBuilder.populateService()方法来完成。

      (b)    接口类型采用Java接口进行描述,则会利用接口提供的Java类生成,在此主要通过增加Parameter参数来完成,代码样例如下:

          AxisService axisService = new AxisService();

          Parameter classParam = new Parameter(Constants.SERVICE_CLASS, "interfaceName");

          axisService.addParameter(classParam);

2、接管Web Service允许调用的操作

      (a)    针对AxisService中定义的所有操作AxisOperation,定义其接管的业务方法处理,这通过设置AxisOperation的MessageReceiver来完成。

      (b)    扩展axis2中的抽象类AbstractInMessageReceiver,实现抽象方法invokeBusinessLogic来完成业务操作的调用。

3、把生成的AxisService对象加入到axis2的配置上下文中

      (a)    根据配置文件axis2.xml生成AxisConfiguration对象

      (b)    利用生成的AxisConfiguration对象,建立配置上下文ConfigurationContext

      (c)    AxisConfiguration对象中添加生成的AxisService

4、建立Axis2ServiceServlet,监听请求

      (a) 新建对象Axis2ServiceServlet servlet = new Axis2ServiceServlet();

      (b) 利用上下文对Servlet初始化servlet.init(configContext);

      (c) 设置上下文的URL,也就是要监听的URL。configContext.setContextRoot(servletURI);

    经过以上步骤,服务端针对每个URL都生成了一个AxisServlet监听客户的请求,每个请求的参数都以OMelement类型进行了封装。

服务调用的序列图如下:

二、引用外部的Web Service

在构件中可以通过引用调用外部的服务,如要引用外部的Web Service,在引用(reference)节点上添加binding.ws来实现,通过属性wsdlElement指定引用外部Web Service的address。其处理过程如下:

1、 针对每个reference调用,生成一个axisClient,

      (a)    根据wsdlElement属性值,找到对应的WSDL,生成AxisService(步骤同上1(a))。

      (b)    生成axis的配置上下文(步骤同上(3))。

      (c)    生成Axis调用客户端ServiceClient client = ServiceClient(configContext, axisService);

2、 调用时,解析传入的Message,发送请求

      (a)  根据要调用的操作,生成OperationClient,方式为ServiceClient.createClient(wsdlOperationName)

      (b) 解析传入的OMelement Message,生成SOAPEnvelope。把Message中的值添加到SOAPEnvelope的Body当中,进行数据传递。

      (c)生成传递信息上下文MessageContext

             (i)  生成MessageContext,并设置其信封,MessageContext.setEnvelope(SOAPEnvelope);。

            (ii)  设置调用服务器的Endpoint

                  MessageContext. .setTo(new EndpointReference("address"));

            (iii)  把生成的信息上下文MessageContext添加到OperationClient当中

                  operationClient.addMessageContext(MessageContext);

      (d)发起请求

            operationClient.execute(true);

3、 返回调用结果,从返回的SOAP信息中取得结果值

            MessageContext responseMC = operationClient.getMessageContext("In");

            OMElement response = responseMC.getEnvelope().getBody().getFirstElement();

经过上述步骤,就完成了一个完整的Web Service客户端的调用,其序列图如下: 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值