前言 axis1中调用webservice服务一般来说比较繁琐,但是如果发布的webservice服务是继承了Remote类的接口类的方法的话,则调用方式会变得十分简洁,而且调用时只需要关注被发布服务的类
前言
axis1中调用webservice服务一般来说比较繁琐,但是如果发布的webservice服务是继承了Remote类的接口类的方法的话,则调用方式会变得十分简洁,而且调用时只需要关注被发布服务的类实现的接口类的名字,不需关注被发布的接口实现类的名字。
即,比如接口类为 A,其实现类为AImpl,发布的是AIpml,但是在调用的时候,通过A即可。
具体实施
1、接口类,继承Remote类
package com.demo.action; import java.rmi.Remote; /** * webservice的接口模式 * 实现Remote接口 * @author WuJieJecket * */ public interface RmiRemote extends Remote { /** * 设定打印字符串 */ public String writeStrByRmi(String str); }
2、接口实现类
package com.demo.action; public class RmiRemoteImpl implements RmiRemote { public String writeStrByRmi(String str) { System.out.println("输入什么就打印什么,那么输出的内容是:"+str); return str; } }
3、发布服务
<?xml version="1.0" encoding="UTF-8"?><!-- 本文档是Rmi的测试方法,以接口的形式调用webservice服务 --> <deployment xmlns="http://xml.apache.org/axis/wsdd/" xmlns:java="http://xml.apache.org/axis/wsdd/providers/java"> <service name="RmiRemote" provider="java:RPC"> <parameter name="className" value="com.demo.action.RmiRemoteImpl" /> <!-- * 代表所有的方法都暴露 --> <parameter name="allowedMethods" value="*" /> <parameter name="scope" value="request" /> </service> </deployment>
4、以wsdd方式发布服务
java -Djava.ext.dirs=lib org.apache.axis.client.AdminClient -l http://localhost:8080/webserviceAxis1/services/HelloWSDD deployRmiRemote.wsdd
5、确认发布成功
http://localhost:8080/webserviceAxis1/services
取得wsdl地址
http://localhost:8080/webserviceAxis1/services/RmiRemote?wsdl
6、测试
private static final String url2="http://localhost:8080/webserviceAxis1/services/RmiRemote";
@Test
public void TestWriteStrByRmi() throws ServiceException, RemoteException{
//获取Service 对象-创建服务 -传统方式
Service service=new Service();
//通过 Service 对象获取远程调用对象Call-创建调用句柄
Call call=(Call) service.createCall();
//设置远程调用桩-设置请求地址
call.setTargetEndpointAddress(url2);
//设置远程操作方法名
/**
* 设置调用的方法和方法的命名空间;
* 因为这里是手动发布到webroot目录下的,所以命名空间和请求地址一致
* 当然null也可以,因为本身它就没有设置命名空间,一般方法的命名空间是
* 包名倒写组成,如com.hoo.service,ns=http://service.hoo.com
* getSayHello 是要调用的方法名
*/
call.setOperationName(new QName(null,"writeStrByRmi"));
//设置参数,执行远程方法
call.invoke(new Object[]{"普通模式的调用,RMI是可以使用一般模式调用的"});
/*****************************************************************************/
//远程接口模式
RmiRemote rmi = (RmiRemote) service.getPort(url2, RmiRemote.class);
System.out.println(rmi.writeStrByRmi("RMI接口模式调用,非常简便"));
}
结束