現在、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}
回答1件
あなたの回答
tips
プレビュー