前言
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接口模式调用,非常简便"));
}
结束