2016-04-15 88 views
-3

当我使用Scheduler时,HttpServletResponse没有返回任何值。在下面的代码中直到“RETURNED”在控制台中打印。但是out.println(previousLastLine)的下一行没有返回。任何建议将不胜感激。提前致谢。Http servlet不返回任何值

import java.io.BufferedReader; 
import java.io.FileReader; 
import java.io.IOException; 
import java.io.PrintWriter; 

import javax.servlet.ServletException; 
import javax.servlet.annotation.WebServlet; 
import javax.servlet.http.HttpServlet; 
import javax.servlet.http.HttpServletRequest; 
import javax.servlet.http.HttpServletResponse; 

@WebServlet(value="/notifyController") 
public class NotificationController extends HttpServlet{ 

    int rep = 0; 
    String previousTime = null; 
    String previousLastLine = null; 
    String lastText = null; 
    int count = 0; 
    boolean changeFlag = false; 
    final long timeInterval = 1000; 
    HttpServletResponse response = null; 

    @Override 
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { 
     response = resp; 
     if(rep == 0){ 
      Runnable runnable = new Runnable() { 
       public void run() { 
        while (true) { 
         changeFlag = scheduleTask(); 
         if(changeFlag == true){ 
          try { 
           System.out.println("RETURNED"); 
           response.setContentType("text/html"); 
           PrintWriter out = response.getWriter(); 
           out.println(previousLastLine); 
           out.flush(); 
          } catch (IOException e) { 
           e.printStackTrace(); 
          } 
         } 
         try { 
          Thread.sleep(timeInterval); 
         } catch (InterruptedException e) { 
          e.printStackTrace(); 
         } 
        } 
       } 
      }; 
      Thread thread = new Thread(runnable); 
      thread.start(); 
      rep++; 
     } 
    } 

    public boolean scheduleTask(){ 
     BufferedReader br = null; 
     try { 
      String sCurrentLine; 
      br = new BufferedReader(new FileReader("D:/messagedetails.txt")); 
      while ((sCurrentLine = br.readLine()) != null) { 
       if(lastText != sCurrentLine){ 
        lastText = sCurrentLine; 
       } 
      } 
      if(count == 1 && !previousLastLine.equalsIgnoreCase(lastText)){ 
       previousLastLine = lastText; 
       return true; 
      } 
      previousLastLine = lastText; 
      count = 1; 
     } catch (IOException e) { 
      e.printStackTrace(); 
     } finally { 

      try { 
       if (br != null)br.close(); 
      } catch (IOException ex) { 
       ex.printStackTrace(); 
      } 
     }  
     return false; 
    } 
} 
+0

有没有在日志中的异常? – brso05

+0

你想实现长轮询吗?如果是这样,你在@WebServlet注释中缺少asyn属性。检查这个http://stackoverflow.com/questions/8081895/implementing-long-polling-in-an-asynchronous-fashion – Walfrat

回答

0

您似乎试图设置响应类型并使用后台线程编写响应正文。这不会在doPost方法中起作用。

问题是,当doPost调用返回时,servlet框架将立即“提交”一个空主体的响应。当后台线程的run()方法尝试在响应对象上调用setContentType时,它将引发异常。

您正在捕获IOException,但我敢肯定,抛出的异常是未经检查的异常。 (如果你检查日志文件,你可能会在那里看到异常堆栈跟踪。)

如果你试图实现某种异步行为,那么你需要使用符合Servlet 3.0规范的容器,并且你需要编码你的servlet有所不同。

参考: