Java(Spring)で外部APIにHTTPリクエストを投げたいのですが、そのAPIのレスポンスが遅いので処理に時間がかかります。
APIのレスポンスは処理にはつかわないので、投げっぱなしにして非同期で処理を進めるにはどのように実装したらよいでしょうか。
今はこのように実装しています
Java
1 2import lombok.RequiredArgsConstructor; 3import lombok.extern.slf4j.Slf4j; 4import org.springframework.http.HttpEntity; 5import org.springframework.http.HttpMethod; 6import org.springframework.http.ResponseEntity; 7import org.springframework.stereotype.Component; 8import org.springframework.web.client.HttpClientErrorException; 9import org.springframework.web.client.RestClientException; 10import org.springframework.web.client.RestTemplate; 11 12/** 13 * 外部APIリクエスト用のクラス. 14 * 15 * @author regpon 16 * @version 0.0.1 17 */ 18@Slf4j 19@Component 20@RequiredArgsConstructor 21public class ExternalApiClient { 22 /** 23 * APIを呼び出す. 24 * 25 * @param url URI 26 * @param entity HTTP request params 27 * @param responseType レスポンスのクラスタイプ 28 * @return APIレスポンス 29 * @throws RestClientException RestClientエラー 30 */ 31 public <T> T get(final String url, 32 final HttpEntity<String> entity, 33 final Class<T> responseType) throws RestClientException { 34 RestTemplate restTemplate = this.restTemplate(); 35 try { 36 ResponseEntity<T> res = restTemplate.exchange(url, HttpMethod.GET, entity, responseType); 37 38 return res.getBody(); 39 } catch (HttpClientErrorException hcex) { 40 // エラーレスポンスの場合 41 log.warn("HttpClientErrorException exception=[{}]", hcex.toString()); 42 throw hcex; 43 } catch (RestClientException rcex) { 44 log.warn("RestClientException exception=[{}]", rcex.toString()); 45 throw rcex; 46 } 47 } 48}
呼び出し元
Java
1 public void main(){ 2 // 中略 3 // 外部API実行(パラレルで実行も可能) 4 for (Data data : dataList) { 5 // ここが遅い(1回につき5秒くらいかかる) 6 getRequestData(url, detail.getDataId()); 7 } 8 // 中略 9 } 10 11 private void getRequestData(String url, Long id) { 12 HttpHeaders headers = new HttpHeaders(); 13 headers.setContentType(MediaType.APPLICATION_JSON); 14 HttpEntity<String> entity = new HttpEntity<>(headers); 15 16 String params = "id=" + id.toString(); 17 18 // resは使わない 19 Map res = externalApiClient 20 .get(url + "?" + params, 21 entity, 22 Map.class 23 ); 24 }
呼び出し元側でもパラレルで叩いてもOKですが、
そもそもが遅いのでレスポンスを使わないなら投げっぱなしで処理を進めたいのですが可能でしょうか?
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。