0

我们有一个 asmx 网络服务。我必须使用 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在我的代码中多次调用该方法,但只有在第一次调用返回客户端时才会转到下一行。

编辑

谁能给我一些关于 ExecutorService 的指针?我已经阅读了一些选项,例如 invokeAll,但我无法将其与 JAX-WS 联系起来。任何帮助将不胜感激。

谢谢

4

1 回答 1

0

我强烈建议您在所有代码中始终使用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!
      }
    });
于 2013-10-23T12:32:00.750 回答