作者热门文章
- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我需要使用 Tomcat 7 托管的 CXF 3 开发 Web 服务操作。我们的模型层是 Spring 3。此操作调用由远程服务器托管的 16 个其他 Web 服务。我们需要等待所有响应才能构建我们自己操作的响应。目前,我们按顺序调用每个远程操作。当然,我们有响应时间问题。我认为我们应该并行化我们的操作内部调用并同步不同的响应。
什么样的多线程实现才能安全?我们可以做些什么来让它变得更好?
最佳答案
我会在 @Service
中使用 Java 的通用 Future
和 Spring 的 @Async
方法。
简而言之,您按顺序调用服务并获取所有结果作为 Future
,然后您只需检查所有 future 是否已完成处理即可。如果有这种可能性,您也可以对部分数据进行一些处理。
这是a simple example关于如何去做。链接中的示例服务:
@Service
public class GitHubLookupService {
RestTemplate restTemplate = new RestTemplate();
@Async
public Future<User> findUser(String user) throws InterruptedException {
System.out.println("Looking up " + user);
User results = restTemplate.getForObject("https://api.github.com/users/" + user, User.class);
// Artificial delay of 1s for demonstration purposes
Thread.sleep(1000L);
return new AsyncResult<User>(results);
}
}
以及使用它的方法:
@Override
public void run(String... args) throws Exception {
// Start the clock
long start = System.currentTimeMillis();
// Kick of multiple, asynchronous lookups
Future<User> page1 = gitHubLookupService.findUser("PivotalSoftware");
Future<User> page2 = gitHubLookupService.findUser("CloudFoundry");
Future<User> page3 = gitHubLookupService.findUser("Spring-Projects");
// Wait until they are all done
while (!(page1.isDone() && page2.isDone() && page3.isDone())) {
Thread.sleep(10); //10-millisecond pause between each check
}
// Print results, including elapsed time
System.out.println("Elapsed time: " + (System.currentTimeMillis() - start));
System.out.println(page1.get());
System.out.println(page2.get());
System.out.println(page3.get());
}
关于java - 如何将并行进程同步到 Web 服务中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33147944/
我是一名优秀的程序员,十分优秀!