Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 长时间运行任务并忽略后续的doGet()调用_Java_Servlets - Fatal编程技术网

Java 长时间运行任务并忽略后续的doGet()调用

Java 长时间运行任务并忽略后续的doGet()调用,java,servlets,Java,Servlets,我有一个简单的servlet,可以将视频文件返回到客户端。我想做的是将文件从URL下载到我的服务器上,然后将新下载的文件发送到客户端。我的问题是servlet的入口点在doGet()方法中,客户机在该方法中请求文件。我想下载该文件一次,并将其用作静态文件。但是,由于我在doGet()内调用了download函数,当客户端试图获取文件时,它会不断重复doGet()内发生的一切,并且我的文件会不断被覆盖。这真的减慢了整个过程。我是否可以调用一次下载功能 public void doGet(HttpS

我有一个简单的servlet,可以将视频文件返回到客户端。我想做的是将文件从URL下载到我的服务器上,然后将新下载的文件发送到客户端。我的问题是servlet的入口点在doGet()方法中,客户机在该方法中请求文件。我想下载该文件一次,并将其用作静态文件。但是,由于我在doGet()内调用了download函数,当客户端试图获取文件时,它会不断重复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()执行一次。我该怎么做?

您可以向会话变量添加布尔标志。例如,第一次执行do get时:

boolean started = true;

然后,在调用Utility.sendFile()之前,检查布尔标志是否为true或false,并相应地运行该方法。

doGet用于响应通过它的每个GET请求。您需要在某个地方有一个标志或一个线程来处理文件,直到文件完成。此外,您还可以添加一些基本的缓存机制,以防其他用户希望下载相同的文件。谢谢。你完全正确。哦,这完全有道理。真不敢相信我居然没想到。谢谢