Вызов различных веб-сервисов параллельно из Webapp

We've got a stipes (java) web-app that needs to make about 15 different webserivce calls all from one method. For example: ...

    public Resolution userProfile()
    {
        serviceOneCall();
        serviceTwoCall();
        serviceThreeCall();
        serviceFourCall();
        ....
        serviceTenCall();

        return new RedirectResolution("profiel.jsp");
    }

Все они могут вызываться параллельно и не зависят друг от друга. Единственное, что делает большинство всех этих вызовов, - это помещает данные в сеанс, и один или два могут помещать данные в один и тот же объект, который находится в сеансе, поэтому безопасность потоков, вероятно, является проблемой.

Кто-нибудь может предложить хороший способ вызова всех этих одновременно?

Ответы на вопрос(3)

ИспользуйтеExecutorService с пулом потоков для отправкиCallableДля каждой WS необходимо вызвать и синхронизировать объект, который обновляется при наличии возможности одновременной модификации.

Вы можете использоватьГуавы & APOS; s одновременные расширения для более легкого управленияFutureс использованием, например,Futures.allAsList() который преобразуетList<Future<T>> вFuture<List<T>>так что у вас есть только одинget() сделать, чтобы дождаться всех ответов.

 14 сент. 2012 г., 15:22
вау, Futures.allAsList () довольно мило
 14 сент. 2012 г., 16:17
@mattb Весь пакет на самом деле:ListeningExecutorService, ListenableFuture & Амп;Futures позволяют связывать асинхронные вызовы, иметь обратные вызовы и т. д.
Решение Вопроса

Все решения для параллельного выполнения этой работы будут включать создание новых потоков или отправку заданий в пул потоков для выполнения вызовов удаленной сети.

Хороший способ избежать проблем с безопасностью нитей - использоватьexecutorService и представить подклассыCallable<T> (либоsubmit(Callable) или жеinvokeAll(Collection<Callable>) методы) и Callables возвращают значение ответа. Таким образом, ваш начальный метод может просто обрабатывать возвращаемые значения каждого вызова и выбирать установку ответов в сеансе или обновлять другие объекты, а не эту работу, происходящую в другом потоке.

Итак, основной алгоритм:

Submit each of these calls to an executorService in Callable<T> subclasses Collect the Future<T>s you get back from the executorService Call Future.get() on each to block until you have a response, and then process the responses however you wish back on the main thread
 14 сент. 2012 г., 12:09
вам все равно нужно синхронизироваться на общих объектах сеанса.
for (i = 0; i <= numOfServiceCalls; i++) {
    new Thread(new Runnable() {
        switch(i) {
            case 1 : serviceOneCall();
                     break();
            case 2 : serviceTwoCall();
                     break();
            // Keep going with as many cases as you have.
        }
    });
}

Ваш ответ на вопрос