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

来源:百度文库 编辑:神马文学网 时间:2024/04/27 14:31:16
在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客户端的调用,其序列图如下:

4月28日 9:54:39