gpt4 book ai didi

java - 如何将并行进程同步到 Web 服务中?

转载 作者:行者123 更新时间:2023-12-01 11:03:34 26 4
gpt4 key购买 nike

我需要使用 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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com