最近在做webservice的调用问题,发现如果被调用的WebService方法长时间不返回,客户端将一直被阻塞,直到该方法返回为止。使用同步方法来调用WebService虽然很直观,但当WebService方法由于各种原因需要很长时间才能返回的话,就会使客户端程序一直处于等待状态,这样对客户体验是非常差的。
axis2通过wsdl2java.bat可以生成异步客户端,实现异步调用 的效果,下面一起看一看怎么操作的:
一、设置axis2的环境变量,如下图所示:
二、利用axis2中的wsdl2java.bat生成客户端程序:
命令:wsdl2java -uri http://localhost:8081/TestAxis2Ws/services/HelloService?wsdl -p axis2.service.server -o stub
其中-uri参数指定了wsdl文件的路径,可以是本地路径,也可以是网络路径。-p参数指定了生成的Java类的包名,-o参数指定了生成的一系列文件保存的根目录
这时到axis2的bin目录下会发现出现了一个stub目录,如下图所示:
其中TestStub.java是客户端程序,TestCallbackHandler.java是异步客户端程序。
把这两个类复制到上次已经建立好的服务端工程里,然后改一下错误就可以使用了
三、怎么使用异步客户端
1、编写一个继承TestCallbackHandler的子类
package com.test;
import com.stub.TestCallbackHandler;
import com.stub.TestStub.GetNameResponse;
public class MyTestCallbackHandler extends TestCallbackHandler {
@Override
public void receiveResultgetName(GetNameResponse result) {
// 输出getName方法的返回结果
System.out.println(result.get_return());
}
}
2、编写测试程序:
package com.test;
import java.io.IOException;
import java.rmi.RemoteException;
import com.stub.TestStub;
import com.stub.TestStub.GetName;
public class TestClient {
public static void main(String[] args) throws InterruptedException, IOException {
// TODO Auto-generated method stub
TestStub stub = new TestStub();
GetName getName=new GetName();
// 异步调用WebService
stub.startgetName(getName,new MyTestCallbackHandler());
System.out.println("异步调用!");
// 阻止程序退出
System.in.read();
}
}
这样就可以测试出异步调用的效果了,使用的时候有不懂的地方可以评论给我……