我们有一个stipes (java) web-app,它需要通过一个方法进行大约15个不同的webserivce调用。例如:...
public Resolution userProfile()
{
serviceOneCall();
serviceTwoCall();
serviceThreeCall();
serviceFourCall();
....
serviceTenCall();
return new RedirectResolution("profiel.jsp");
}
所有这些都可以并行调用,并且彼此不依赖。大多数这些调用所做的一件事就是将数据放入会话中,其中一两个可能会将数据放入会话中的同一对象中,因此线程安全可能是一个需要考虑的问题。
有没有人能建议一种同时调用所有这些的好方法?
发布于 2012-09-13 20:16:52
并行完成这项工作的所有解决方案都将涉及生成新线程或将作业提交到线程池,以便远程网络调用发生。
避免线程安全问题的一个好方法是使用executorService
并提交Callable<T>
的子类(给submit(Callable)
或invokeAll(Collection<Callable>)
方法),然后让可调用函数返回响应值。这样,您的初始方法就可以简单地处理每个调用的返回值,并选择在会话中设置响应或更新其他对象,而不是在另一个线程中执行此工作。
所以基本算法是:
Callable<T>
Future<T>
返回的每个Future.get()
,直到有响应为止,然后在主线程上按您希望的方式处理响应。
发布于 2012-09-13 20:14:53
使用具有线程池的ExecutorService
为您需要调用的每个WS提交Callable
,并在有可能发生并发修改时更新的对象上进行同步。
您可能希望使用Guava's并发扩展来更轻松地管理Future
,例如使用Futures.allAsList()
将List<Future<T>>
转换为Future<List<T>>
,因此您只需执行一个get()
即可等待所有答案。
发布于 2012-09-13 19:56:55
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.
}
});
}
https://stackoverflow.com/questions/12413708
复制相似问题