一、相关概念
1、SOA(service oriented architecture)面向服务的架构。
2、SCA(service component architecture,服务构建架构)提供了一种编程模型,可以支持基于SOA的应用程序实现。
3、Tuscany是一个基于SCA的开源框架。
4、Axis2 是Apache退出的支持web service模型的工具软件,Tuscany Java SCA实际也是使用Axis2来将构件对外发布为web service的。
二、开发过程
1、设计思想
2、实现服务端的具体服务
MyServiceInterface.java
public interface MyServiceInterface{ public String function(); }
MyServiceImp.java
3、编写服务端配置文件
myService.composite
<?xml version="1.0" encoding="UTF-8"?> <composite xmlns="http://www.osoa.org/xmlns/sca/1.0" targetNamespace="http://myService" name="myService">
<!--service标签用于配置SCA服务--> <service name="Hello" promote="myServiceComponent"> <!--name属性指出服务的名称,promote指出服务要提升哪个构件--> <binding.ws uri="http://127.0.0.1:8084/myService"/> <!-- <bindling.ws>标签用于将服务绑定为web service。uri给出绑定后的web service访问URI --> </service>
<!--配置构件--> <component name="myServiceComponent"> <implementation.java class="com.MyServiceImp"/> </component> </composite>
4、启动服务端程序
StartWebService.java
import java.io.IOException; import org.apache.tuscany.sca.host.embedded.SCADomain; public class StartWebService { public static void main(String[] args) { SCADomain scaDomain = SCADomain.newInstance("com/myService.composite");//加载组合构件文件 try { System.out.println("SOA服务启动完毕..."); System.in.read(); } catch(IOException e) { e.printStackTrace(); } scaDomain.close(); } }
5、编写客户端程序
//必需的包 import javax.xml.namespace.QName; import org.apache.axis2.AxisFault; import org.apache.axis2.addressing.EndpointReference; import org.apache.axis2.client.Options; import org.apache.axis2.rpc.client.RPCServiceClient; public class MyRPCClient{ public static void main(String[] args) throws AxisFault{ RPCServiceClient serviceClient =new RPCServiceClient() ; Options options = serviceClient.getOptions();
String uri = WebServiceInfoUtil.geturl("http://127.0.0.1:8084/myService");//uri及targetNamespace和服务端的配置一致
String targetNamespace = WebServiceInfoUtil.getNamespace("http://myService");
//设定服务 提供者的地址 EndpointReference targetEPR = new EndpointReference(uri); options.setTo(targetEPR); //设定所要调用的服务的操作 QName opGetSearchKeyword = new QName(targetNamespace,"function"); //返回类型 Class[] returnTypes = new Class[] { String[].class}; //设定调用的方法的参数值(服务端程序所需要的参数值) Object[] opGetSearchInfoServiceArgs = new Object[]{args1}; //得到调用的结果,假设所调用的方法返回是string[]类型 //两种方法 //方法1、 String[] response = (String[])serviceClient.invokeBlocking(opGetSearchKeyword, opGetSearchInfoServiceArgs, returnTypes)[0]; //方法2、 Object[] response = (String[])serviceClient.invokeBlocking(opGetSearchKeyword, opGetSearchInfoServiceArgs, returnTypes); String[] result=(String[]) response[0]; ......//对得到的结果进行操作 } }
参考资料:《SOA实践者说:分布式环境下的系统集成 》 邓子云