首页 > 代码库 > SOA(在Tuscany 中开发web service)

SOA(在Tuscany 中开发web service)

一、相关概念

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实践者说:分布式环境下的系统集成 》 邓子云