在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,在其中分为两种情况
接口类型为WSDL定义的接口,则会利用其对应的WSDL文件对应的Definition对象生成,在此主要用到了axis2提供的WSDLToAxisServiceBuilder.populateService()方法来完成。
接口类型采用Java接口进行描述,则会利用接口提供的Java类生成,在此主要通过增加Parameter参数来完成,代码样例如下:
AxisService axisService = new AxisService();
Parameter classParam = new Parameter(Constants.SERVICE_CLASS, “interfaceName”);
axisService.addParameter(classParam);
2、接管Web Service允许调用的操作
针对AxisService中定义的所有操作AxisOperation,定义其接管的业务方法处理,这通过设置AxisOperation的MessageReceiver来完成。
扩展axis2中的抽象类AbstractInMessageReceiver,实现抽象方法invokeBusinessLogic来完成业务操作的调用。
3、把生成的AxisService对象加入到axis2的配置上下文中
根据配置文件axis2.xml生成AxisConfiguration对象
利用生成的AxisConfiguration对象,建立配置上下文ConfigurationContext
AxisConfiguration对象中添加生成的AxisService
4、建立Axis2ServiceServlet,监听请求
新建对象Axis2ServiceServlet servlet = new Axis2ServiceServlet();
利用上下文对Servlet初始化servlet.init(configContext);
设置上下文的URL,也就是要监听的URL。configContext.setContextRoot(servletURI);
经过以上步骤,服务端针对每个URL都生成了一个AxisServlet监听客户的请求,每个请求的参数都以OMelement类型进行了封装。
服务调用的序列图如下:
二、引用外部的Web Service
在构件中可以通过引用调用外部的服务,如要引用外部的Web Service,在引用(reference)节点上添加binding.ws来实现,通过属性wsdlElement指定引用外部Web Service的address。其处理过程如下:
1、 针对每个reference调用,生成一个axisClient,
根据wsdlElement属性值,找到对应的WSDL,生成AxisService(步骤同上1(a))。
生成axis的配置上下文(步骤同上(3))。
生成Axis调用客户端ServiceClient client = ServiceClient(configContext, axisService);
2、 调用时,解析传入的Message,发送请求
根据要调用的操作,生成OperationClient,方式为ServiceClient.createClient(wsdlOperationName)
解析传入的OMelement Message,生成SOAPEnvelope。把Message中的值添加到SOAPEnvelope的Body当中,进行数据传递。
生成传递信息上下文MessageContext
生成MessageContext,并设置其信封,MessageContext.setEnvelope(SOAPEnvelope);。
设置调用服务器的Endpoint
MessageContext. .setTo(new EndpointReference(“address”));
把生成的信息上下文MessageContext添加到OperationClient当中
operationClient.addMessageContext(MessageContext);
发起请求
operationClient.execute(true);
3、 返回调用结果,从返回的SOAP信息中取得结果值
MessageContext responseMC = operationClient.getMessageContext(“In”);
OMElement response = responseMC.getEnvelope().getBody().getFirstElement();
经过上述步骤,就完成了一个完整的Web Service客户端的调用,其序列图如下:
原文出处:http://gocom.primeton.com/blog9372_26284.htm
我们一直都在努力坚持原创.......请不要一声不吭,就悄悄拿走。
我原创,你原创,我们的内容世界才会更加精彩!
【所有原创内容版权均属TechTarget,欢迎大家转发分享。但未经授权,严禁任何媒体(平面媒体、网络媒体、自媒体等)以及微信公众号复制、转载、摘编或以其他方式进行使用。】
微信公众号
TechTarget
官方微博
TechTarget中国
相关推荐
-
联合创新,携手共赢 华为与Commvault签署全球合作联盟协议
【中国,上海,2015年9月19日】在2015年华为云计算大会上,全球领先的信息与通信解决方案供应商华为与美国知名的数据管理软件及相关服务主要供应商Commvault签署全球合作联盟协议。基于合作协议,双方将会加大投入数据中心备份解决方案在云化环境下的“可服务化”技术研究 。Commvault公司全球业务发展副总裁Andreas May、华为IT数据中心解决方案总裁马力出席签约仪式。
-
如何透过业务和技术看SOA的发展
随着SOA发展的深入,各种SOA相关技术标准也随之发展和完善。面对庞大而复杂的SOA相关技术标准,我们如何来有选择的使用它们呢?
-
专家全面解读WebService开发技术的奥秘
SOA是当今企业软件架构的热点,而Web Service是SOA的一种较好的实现方式,但你对Web Service了解多少?
-
SOA架构下补偿模型驱动的安全苛求软件开发
随着我国高速铁路的快速发展,传统的计算机联锁软件开发方法在灵活性、可维护性、安全性以及开发效率上都显露出不足,怎样才能弥补这一不足呢?