🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

Q&A

解決済

2回答

4961閲覧

Javaで非同期でHTTPリクエストを投げたい

退会済みユーザー

退会済みユーザー

総合スコア0

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Spring

Spring Framework は、Javaプラットフォーム向けのオープンソースアプリケーションフレームワークです。 Java Platform上に、 Web ベースのアプリケーションを設計するための拡張機能が数多く用意されています。

0グッド

1クリップ

投稿2019/09/20 07:26

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ですが、
そもそもが遅いのでレスポンスを使わないなら投げっぱなしで処理を進めたいのですが可能でしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

Springのクラスから非同期にリクエストを投げて、特にそのレスポンスを利用しないなら、HTTPリクエストを実行するクラスに@Asyncを付けるだけです。

@EnableAsyncをアプリケーション設定に付与してください。

投稿2019/09/25 00:51

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

Threadクラスでも使って、非同期で投げてしまえばいいだけのような気がしますが。

Java

1new Thread(() -> { 2 getRequestData(url, detail.getDataId()); 3 }).start();

投稿2019/09/20 08:45

LineOfLightning

総合スコア253

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

退会済みユーザー

退会済みユーザー

2019/09/21 01:18

すみません、その単純なことがわかっていませんでした。 助かりました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問