Java 从Webapp并行调用不同的Webservices
我们有一个stipes(java)web应用程序,它需要从一个方法进行大约15个不同的webserivce调用。例如: 所有这些都可以并行调用,并且互不依赖。大多数这些调用都在做的一件事是将数据放入会话中,一两个调用可能会将数据放入会话中的同一个对象中,因此线程安全可能是其中的一个问题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 =
有人能建议一种同时调用所有这些的好方法吗
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未来
sFuture.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.
}
});
}