-1

我想使用 RestTemplate 多次调用第三方 API(对于我必须调用 REST API 的每个客户 ID),目前我已经编写如下,它工作正常,但它需要时间,因为有很多客户我会调用 API对于每个客户 ID,有什么办法可以使这个并行。

 public List<Organization> getCustomeOrganizationInfo(){
   String url="https://url.net/core/v1/customers"
   List<Organization> organizationList = new ArrayList<>();

    for(Customer customer:CustomerList){

      String restUrlWithUserId=url+"/customer.getCustomerId"

        CustomerInfo customerInfo = restTemplate.exchange(
                restUrlWithUserId,
                HttpMethod.GET,
                request,
                String.class
        );
        
    Organization organization =new Organization();
    organization.setCustomerId(customer.getCustomerId())
    organization.setorganizationId(customerInfo.getCustomeOrganizationId())
    organization.setorganizationname(customerInfo.getCustomeOrganizationName())
        
   organizationList.add(organization)       
}

}
4

2 回答 2

0

有什么办法可以使这个平行

对于并发和干净的代码,您应该将您的 restTemplate 调用分离到另一个类(服务),例如,ThirdPartyCustomerService.java. 这个班级将负责打电话到外面。

@Service
public class ThirdPartyCustomerService {
   private final RestTemplate restTemplate;
   private final String url = '...';
   ...
   public CustomerInfo getCustomerInfo() {
       return this.restTemplate...
   }
}

然后你可以将这个类注入你的服务类。现在,如果您想并发运行它。你可以@Async试试Future 这里。只需要对新服务进行一些更改,并记住在您的主服务上调用 Future.get()。

@Async
public Future<CustomerInfo> getCustomerInfo() {
   return new AsyncResult<CustomerInfo>(this.restTemplate...);
}

或者您可以使用 WebClient,它是 RestTemplate 和 AsyncRestTemplate 的替代品。

于 2022-02-11T13:21:59.310 回答
0

我使用并行流编写但数组列表不同步会导致任何问题

public List<Organization> getCustomeOrganizationInfo(){

String url="https://url.net/core/v1/customers"
List<Organization> organizationList = new ArrayList<>();
CustomerList.parallelStream().
.map(customer -> {
               restTemplate.exchange(
                url+customer.getCustomerID(),
                HttpMethod.GET,
                request,
                String.class
        );
        
        Organization organization =new Organization();
        organization.setCustomerId(customer.getCustomerId())
        organization.setorganizationId(customerInfo.getCustomeOrganizationId())
        organization.setorganizationname(customerInfo.getCustomeOrganizationName())
        organizationList.add(organization)
        return organizationList
        
    }).collect(Collectos.toList());
    
} 
于 2022-02-11T13:50:05.043 回答