我们有一个asmx Web服务。我必须使用 WSDL 测试客户端。我已经成功地实现了客户端异步映射的代码。问题是我不明白客户端如何同时向服务器发出多个请求。我已经看到了Future
界面,但我不明白如何使用它进行并发呼叫。
private void callAsyncCallback(String encodedString, String key) {
DataManipulation service = new DataManipulation();
try { // Call Web Service Operation(async. callback)
DataManipulationSoap port = service.getDataManipulationSoap12();
// TODO initialize WS operation arguments here
AsyncHandler<GetDataResponse> asyncHandler =
new AsyncHandler<GetDataResponse>() {
@Override
public void handleResponse(Response<GetDataResponse> response) {
try {
// TODO process asynchronous response here
System.out.println("Output at::: " + new Date().toString());
System.out.println("************************Result = " + response.get().getGetDataResult());
} catch (Exception ex) {
// TODO handle exception
}
}
};
Future<? extends Object> result = port.getDataAsync(encodedString,key, asyncHandler);
while (!result.isDone()) {
// do something
}
} catch (Exception ex) {
// TODO handle custom exceptions here
}
}
我知道我可以在while(!result.isDone())
循环中做一些事情,但是我怎样才能再次调用Web服务?
目的是我必须将多个文件发送到 Web 服务。WS 对这些文件执行一些操作,并发回一些结果。我希望客户端同时发送所有文件,以便花费的时间非常少。我尝试在我的代码中多次调用该方法callAsyncCallback
但只有当第一次调用返回到客户端时,它才会进入下一行。
编辑
谁能给我一些关于执行者服务的指示?我已经阅读了一些选项,例如 invokeAll,但我无法将其与 JAX-WS 联系起来。任何帮助将不胜感激。
谢谢
我强烈建议您在所有代码中始终使用ListenableFuture而不是Future。它更舒适,而且不是您自己的自行车
例:
ListeningExecutorService service = MoreExecutors.listeningDecorator(Executors.newFixedThreadPool(10));
ListenableFuture<Explosion> explosion = service.submit(new Callable<Explosion>() {
public Explosion call() {
return pushBigRedButton();
}
});
Futures.addCallback(explosion, new FutureCallback<Explosion>() {
// we want this handler to run immediately after we push the big red button!
public void onSuccess(Explosion explosion) {
walkAwayFrom(explosion);
}
public void onFailure(Throwable thrown) {
battleArchNemesis(); // escaped the explosion!
}
});