Java 从Webapp并行调用不同的Webservices

Java 从Webapp并行调用不同的Webservices,java,web-services,web-applications,stripes,java.util.concurrent,Java,Web Services,Web Applications,Stripes,Java.util.concurrent,我们有一个stipes(java)web应用程序,它需要从一个方法进行大约15个不同的webserivce调用。例如: 所有这些都可以并行调用,并且互不依赖。大多数这些调用都在做的一件事是将数据放入会话中,一两个调用可能会将数据放入会话中的同一个对象中,因此线程安全可能是其中的一个问题 有人能建议一种同时调用所有这些的好方法吗 for(i=0;i使用带有线程池的ExecutorService为每个需要调用的WS提交Callables,并在有可能并发修改时更新的对象上进行同步 for (i =

我们有一个stipes(java)web应用程序,它需要从一个方法进行大约15个不同的webserivce调用。例如:

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


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

for(i=0;i使用带有线程池的
ExecutorService
为每个需要调用的WS提交
Callable
s,并在有可能并发修改时更新的对象上进行同步

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.
        }
    });
}

您可能希望使用并发扩展来更轻松地管理
未来
,例如使用
Futures.allAsList()
,它将
列表
转换为
未来
,因此您只有一个
get()
等待所有答案。

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

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

所以基本算法是:

  • 将这些调用中的每一个提交给
    Callable
    子类中的executorService
  • 收集您从Executor服务返回的
    未来
    s
  • 在每个to块上调用
    Future.get()
    ,直到有响应为止,然后在主线程上按自己的意愿处理响应

  • 您仍然需要在公共会话对象上进行同步。@mattb整个包实际上是:
    ListeningExecutorService
    ListenableFuture
    &
    Futures
    允许您链接异步调用,进行回调等。
    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.
            }
        });
    }