我们有一个stipes(java)网络应用程序需要从一个方法进行大约15个不同的webserivce调用。例如: ...
public Resolution userProfile()
{
serviceOneCall();
serviceTwoCall();
serviceThreeCall();
serviceFourCall();
....
serviceTenCall();
return new RedirectResolution("profiel.jsp");
}
所有这些都可以并行调用,而不是相互依赖。大多数调用所做的一件事就是将数据放入会话中,一两个可能会将数据放入会话中的同一个对象中,因此线程安全可能是一个问题。
有人能建议同时调用所有这些的好方法吗?
答案 0 :(得分:5)
使用带有线程池的ExecutorService
为您需要调用的每个WS提交Callable
,并在可能同时修改时更新对象。
您可能希望使用Guava's个并发扩展程序,以便更轻松地管理Future
,例如Futures.allAsList()
将List<Future<T>>
转换为Future<List<T>>
所以你只需要一个get()
来等待所有答案。
答案 1 :(得分:5)
并行执行此操作的所有解决方案都将涉及生成新线程或将作业提交到线程池以进行远程网络调用。
避免线程安全问题的一个好方法是使用executorService
并提交Callable<T>
的子类(对submit(Callable)
或invokeAll(Collection<Callable>)
方法)并使用Callables返回响应值。这样,您的初始方法可以简单地处理每个调用的返回值,并选择在会话中设置响应或更新其他对象,而不是在另一个线程中发生此工作。
基本算法:
Callable<T>
子类Future<T>
Future.get()
,直到您收到回复为止,然后处理回复,但希望回到主线程上答案 2 :(得分:-2)
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.
}
});
}