首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >从Webapp并行调用不同的Webservices

从Webapp并行调用不同的Webservices
EN

Stack Overflow用户
提问于 2012-09-14 03:49:02
回答 3查看 2.3K关注 0票数 4

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

代码语言:javascript
运行
复制
    public Resolution userProfile()
    {
        serviceOneCall();
        serviceTwoCall();
        serviceThreeCall();
        serviceFourCall();
        ....
        serviceTenCall();

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

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

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-09-14 04:16:52

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

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

所以基本算法是:

  1. 将这些调用中的每一个都提交到executorService中,以便阻塞从Callable<T> Future<T>返回的每个Future.get(),直到有响应为止,然后在主线程

上按您希望的方式处理响应。

票数 5
EN

Stack Overflow用户

发布于 2012-09-14 04:14:53

使用具有线程池的ExecutorService为您需要调用的每个WS提交Callable,并在有可能发生并发修改时更新的对象上进行同步。

您可能希望使用Guava's并发扩展来更轻松地管理Future,例如使用Futures.allAsList()List<Future<T>>转换为Future<List<T>>,因此您只需执行一个get()即可等待所有答案。

票数 5
EN

Stack Overflow用户

发布于 2012-09-14 03:56:55

代码语言:javascript
运行
复制
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.
        }
    });
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12413708

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档