質問をすることでしか得られない、回答やアドバイスがある。

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

新規登録して質問してみよう
ただいま回答率
85.35%
Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

Q&A

解決済

1回答

1775閲覧

SpringBootのスレッド実行について

bobo

総合スコア45

Java

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

Spring Boot

Spring Bootは、Javaのフレームワークの一つ。Springプロジェクトが提供する様々なフレームワークを統合した、アプリケーションを高速で開発するために設計されたフレームワークです。

0グッド

0クリップ

投稿2021/05/31 02:40

編集2021/05/31 02:47

現在、SpringBootでファイルエクスポートのシステムを作っています。
XX件以上であれば、HTTPResponseはすぐに返し、サーバ側では非同期に生成→完了後操作者にメール通知する様にしてます。

実装自体は以下の様に組み、一応動いてる様なのですが、画面からの操作感では本当に非同期に動いてるのか、漠然と疑問に感じます。

と言うのも、検索一覧とExcel出力のロジック自体は共通なのですが、体感レスポンスではエクスポート処理の方がワンクッションレスポンスが遅い様に感じます。

下記の様にServiceクラスをExecutorServiceに乗せて実行していますが、使い方は正しいでしょうか?

Java

1Controllerクラス 2 3 @PostMapping(value = "/export", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE) 4 @ResponseStatus(HttpStatus.OK) 5 public ResponseEntity<Resource> exportExcel(@RequestBody @Validated MemberSearchParams params) throws IOException, IllegalArgumentException, IllegalAccessException, AuthException { 6 7 List<Member> memberList = memberService.find(params).getList(); 8 9     // 1000件以上はエクスポートファイルをアップロードし、メールで通知する。 10 if (memberList.size() > maximumCount) { 11 ExecutorService executor = Executors.newSingleThreadExecutor(); 12 Future<String> future = executor.submit(new Callable<String>() { 13 @Override 14 public String call() throws IllegalAccessException, IOException { 15 SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMddHHmmss"); 16 String fileName = simpleDateFormat.format(new Date()); 17 18 byte[] excelData = memberService.createExcelData(memberList); 19 memberService.awsUpload(toMail, fileName, excelData); 20 return "SUCCESS"; 21 } 22 }); 23 // 空で返す 24 return ResponseEntity.status(HttpStatus.ACCEPTED).headers(new HttpHeaders()).body(new ByteArrayResource( new byte[0])); 25 } else { 26 byte[] excelData = memberService.createExcelData(memberList); 27 HttpHeaders httpHeaders = new HttpHeaders(); 28 httpHeaders.setContentDispositionFormData("filename", "member.xlsx"); 29 return ResponseEntity.ok().headers(httpHeaders).body(new ByteArrayResource(excelData)); 30 } 31 }

Java

1Serviceクラス 2 3@Service 4public class MemberService { 5 public byte[] createExcelData(List<HumanResourceSearchItem> list) throws IOException, IllegalArgumentException, IllegalAccessException { 6   ・・ 7  } 8}

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

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

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

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

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

m.ts10806

2021/05/31 02:43

想定のとおり動いてるのなら「正しい」と言えるのでは。具体的な問題はレスポンスですか?
bobo

2021/05/31 05:00

ありがとうございます。 そうですね。検索一覧では即レスポンスが返って来て、Exportは同じ件数をDLしても数秒かかります。DBからの取得も全く同じなので、差は出ないと思っていたのですが。。 ググるとExecutorも何パターンかあり、こちらの使い方なのかなと疑問を持ちまして。。 (要件的には1スレッドで実行すれば良いのですが、Responseは即返して実行してほしいと思ってます) final ExecutorService executor = Executors.newSingleThreadExecutor(); final ExecutorService executor = Executors.newFixedThreadPool(2);
m.ts10806

2021/05/31 05:06

非同期とはいえ、投げる分の差はありそうに思います。あくまで私見で手元で試したわけではありませんが
bobo

2021/05/31 07:02

ありがとうございます。 う〜ん、取得件数によって、タイムアウトになってしまいました。 やっぱり同期実行になってる様です。。並列実行になっていない・・のか。。 他のパターンで試してみたいと思います。 final ExecutorService executor = Executors.newFixedThreadPool(1);
bobo

2021/05/31 07:44

やっぱりスレッド生成して投げっぱなししてくれてない様でした。 ググるとParallelStreamのやり方も紹介されていたのでやってみたいと思います。
guest

回答1

0

自己解決

ログで処理時間を出力した所、処理自体は正しく、並列実行もされている様でした。
ただ、問題はControllerクラスにある様で、どうもThraedが終了するまでResponseを返していない様でした。
本題と変わってしまった為、自己解決とし、別に質問させて頂きます。

ご回答頂きありがとうございました。

投稿2021/05/31 11:22

bobo

総合スコア45

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問