Долгосрочная работа и игнорирование последующих вызовов doGet()

У меня есть простой сервлет, который может вернуть видеофайл клиенту. Я хочу сделать это, чтобы загрузить файл с URL-адреса на мой сервер, а затем отправить этот недавно загруженный файл клиенту. Моя проблема заключается в том, что точка входа сервлета находится внутри метода doGet(), где клиент запрашивает файл. Я хочу загрузить файл один раз и использовать его в качестве статического файла. Однако, поскольку я вызываю функцию загрузки внутри моего doGet(), в то время как клиент пытается получить файл, он продолжает повторять все, что происходит внутри doGet(), и мой файл продолжает перезаписываться. Это действительно замедляет весь процесс. В любом случае, я могу просто вызвать функцию загрузки один раз?

public void doGet(HttpServletRequest request, HttpServletResponse response)
 throws ServletException, IOException{
 answerRequest(request, response); 
}
...

public void answerRequest(HttpServletRequest request, HttpServletResponse response) 
 throws IOException{
 String requestedFile = request.getPathInfo();

 URL newURL = "fixed URL content";
 HttpURLConnection connection = (HttpURLConnection) newURL.openConnection();


 sendFile(connection, request, response); 
}

...

public void sendFile(HttpURLConnection connection, HttpServletRequest request, HttpServletResponse response){
 InputStream input = null;
 FileOutputStream output = null;


 File videoFile = new File("path-to-file");
 input = connection.getInputStream();
 output = new FileOutputStream(videoFile);
 Utility.download(input, output, 0, connection.getContentLength()); //this is where the file is downloaded onto my server)


 connection.disconnect();
 close(output);
 close(input);

 //this is where the file is sent back to client
 Utility.sendFile(videoFile, response, request,true);
...
}

Итак, как вы можете видеть, все эти функции происходят каждый раз, когда doGet() происходит. Но я хочу, чтобы Utility.download() выполнялся один раз. Как мне это сделать?

1 ответ

Вы можете добавить булевский флаг в переменную сеанса. Например, когда make get выполняется в первый раз:

boolean started = true;

Затем прямо перед вызовом утилиты Utility.sendFile() проверьте, является ли логический флаг истинным или ложным и соответствующим образом запускает метод.

licensed under cc by-sa 3.0 with attribution.