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

Мы'У нас есть веб-приложение stipes (java), которое должно сделать около 15 различных вызовов webserivce - все из одного метода. Например: ...

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

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

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

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

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

Решение Вопроса

здание новых потоков или отправку заданий в пул потоков для выполнения вызовов удаленной сети.

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

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

Отправьте каждый из этих вызовов executorService вCallable подклассыСобратьFutureЕсли вы вернетесь от executorServiceВызовFuture.get() на каждом блокировать, пока у вас не будет ответа, а затем обработать ответы, как вы хотите вернуться в основной поток
 Geek14 сент. 2012 г., 12:09
вам все равно нужно синхронизироваться на общих объектах сеанса.

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

Вы можете использоватьГуава-х одновременные расширения для более легкого управленияFutureс использованием, например,Futures.allAsList() который преобразуетList

 matt b14 сент. 2012 г., 15:22
вау, Futures.allAsList () довольно мило
 Frank Pavageau14 сент. 2012 г., 16:17
@mattb Весь пакет, на самом деле:ListeningExecutorServiceListenableFuture & Futures позволяют связывать асинхронные вызовы, иметь обратные вызовы и т. д.
for (i = 0; i 

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