从Webapp并行调用不同的Web服务

use*_*664 4 java stripes web-services web-applications java.util.concurrent

我们有一个stipes(java)web-app,需要从一个方法进行大约15个不同的webserivce调用.例如: ...

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

        return new RedirectResolution("profiel.jsp");
    }
Run Code Online (Sandbox Code Playgroud)

所有这些都可以并行调用,而不是相互依赖.大多数这些调用所做的一件事就是将数据放入会话中,并且一两个可能将数据放入会话中的同一对象中,因此线程安全可能是一个问题.

有人能建议同时调用所有这些的好方法吗?

Fra*_*eau 5

使用ExecutorService带线程池的Callables为您需要调用的每个WS 提交s,并在可能同时修改时更新的对象上进行同步.

您可能希望使用Guava的并发扩展来更轻松地管理Futures,例如Futures.allAsList()将a转换List<Future<T>>为a Future<List<T>>,因此您只需要get()等待所有答案.


mat*_*t b 5

并行执行此操作的所有解决方案都将涉及生成新线程或将作业提交到线程池以进行远程网络调用.

避免线程安全问题的一个好方法是使用executorService和提交Callable<T>(submit(Callable)或者invokeAll(Collection<Callable>)方法)的子类并让Callables返回响应值.这样,您的初始方法可以简单地处理每个调用的返回值,并选择在会话中设置响应或更新其他对象,而不是在另一个线程中发生此工作.

所以基本算法:

  1. 将每个调用提交给Callable<T>子类中的executorService
  2. 收集Future<T>你从executorService获得的s
  3. 调用Future.get()每个阻止,直到你有一个响应,然后处理响应,但你希望回到主线程