これはspring mvcに固有のものではありません。これは、サーブレットやWebwork/structsアクションなど、あらゆる種類のWebベースのアクションで行うことができます。
ダウンロードを実行するために送信する要求は、.zipを作成するのではなく、zipを作成するタスクをキューに入れ、別のスレッド(threads?)がそれらの.zipファイルを作成して作成できます。
例えば、
class CreateZipController extends AbstractController {
//tokenService is soemthing that you can save a future with, and return a token for - can be anything reallly...like a map.
public ModelAndView handleRequestInternal(final HttpServletRequest request, HttpServletResponse response) throws Exception {
Future<ZipFile> zipTask = executorService.submit(new Callable<ZipFile>(){
public ZipFile call() {
return createZipFile(request);
}
});
String token = tokenService.saveTask(zipTask);
if (zipTask.isDone() {
ModelAndView mav = new ModelAndView("downloadView");
mav.addObject("url", getDownloadUrlFrom(zipTask.get().getName()));
return mav;
}
ModelAndView mav = new ModelAndView("waitView");
mav.addObject("message", "Please wait while zip is being created");
mav.addObject("token", token);
return mav;
}
}
class GetZipController extends AbstractController {
public ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception {
String token = request.getParameter("token");
Future<ZipFile> zipTask = tokenService.getTaskFrom(token);
if (zipTask.isDone() {
ModelAndView mav = new ModelAndView("downloadView");
mav.addObject("url", getDownloadUrlFrom(zipTask.get().getName()));
return mav;
} else {
ModelAndView mav = new ModelAndView("waitView");
mav.addObject("message", "please wait while the zip is being built");
return mav;
}
}
}
春のMVCとあまり慣れていないイム以来、上記(ライブラリ名/慣習の面で)少しオフになる場合もありますが、基本的な考え方があります - ZIPファイルの作成をキュータスクとして(ExecutorServiceのようなものを使用して)、ビューを素早くレンダリングします。その後、ビュー自体がリフレッシュ(メタリフレッシュタグを使用)されるか、AJAXが別のコントローラをポーリングしてタスクが完了したかどうかを確認します。そうであれば、ダウンロードURLにリダイレクトします。
こんにちは!投稿してくれてありがとう、私はこれをチェックし、コメントをあなたに戻って取得:) –