1

リクエストオブジェクトの配列リストがあります。それらをforループで実行し、ループ内でWebサービスを呼び出して、応答オブジェクトを別の配列リストに追加します。Webサービスに複数のリクエストを送信できるように、スレッドを実装する必要があります。

4

1 に答える 1

0

私はこれを自分で実際に試したことはありませんが、面白いかもしれないと思ったので、いじってみました。

List<RefundOrderResponse> responses = Collections.synchronizedList(new ArrayList<RefundOrderResponse>());

Executor e = Executors.newFixedThreadPool(10);
CompletionService<RefundOrderResponse> ecs = new ExecutorCompletionService<RefundOrderResponse>(e);

// Create some futures based on the requests we have that we want processed
List<Future<RefundOrderResponse>> futures = new ArrayList<Future<RefundOrderResponse>>();

for (final RefundOrderRequest request : requests)
{
    futures.add(ecs.submit(new Callable<RefundOrderResponse>()
    {
        @Override
        public RefundOrderResponse call () throws Exception
        {
            // do the call to the web service here and return the response
            return soapWS.refundOrder(request);
        }
    }));
}

// Now we can process the response, note with a completion service we are assuming process order of responses is not very important.
for (int i = 0; i < futures.size(); i++) {
    responses.add(ecs.take().get());
}

ここでは Java CompletionService を使用しましたが、より具体的にはExecutorCompletionServiceを使用しました (エグゼキューターを使用して並列で実行するため)。応答の処理は任意の順序で実行できることを前提としています。この場合は単に応答リストに追加するだけです。応答リストで何をするつもりかはわかりませんが、リストに追加する代わりにループで処理することができます。

于 2012-09-18T11:24:57.897 に答える