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