2016-04-15 6 views
-3

HttpServletResponse не возвращает никакого значения, когда я использую его с Планировщиком. В следующем коде до "RETURNED" его печать в консоли. Но следующая строка, которая out.println (previousLastLine) не возвращается. Любое предложение будет оценено по достоинству. Заранее спасибо.Http-сервлет не возвращает никакого значения

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

Вы пытаетесь реализовать длительный опрос? Если это так, вы теряете атрибут asyn в аннотации @WebServlet. Проверьте это http://stackoverflow.com/questions/8081895/implementing-long-polling-in-an-asynchronous-fashion – Walfrat

ответ

0

Возможно, вы пытаетесь установить тип ответа и написать тело ответа с помощью фонового потока. Это не будет работать в методе doPost.

Проблема заключается в том, что когда вызов doPost возвращается, структура сервлета немедленно «фиксирует» ответ с пустым телом. Когда метод run() вашего фонового потока пытается вызвать setContentType на объект ответа, он выдает исключение.

Вы ловите IOException, но я уверен, что исключение, которое выбрасывается, является неконтролируемым исключением. (Если вы проверите лог-файлы, вы можете увидеть там исключение stacktrace.)

Если вы пытаетесь реализовать какое-то асинхронное поведение, вам необходимо использовать контейнер, совместимый с сервлетами 3.0, и вам нужно ввести код ваш сервлет по-разному.

Ссылка:

Смежные вопросы