[英]Java Servlet keep on sending messages
我正在使用HTML5服務器發送的事件,我想從服務器向客戶端發送隨機消息。 以下是MessageServlet.java的一部分:
PrintWriter writer = response.getWriter();
Random rnd1 = new Random();
Random rnd2 = new Random();
for(int i = 0; i < 5; i++) {
//each message that we end must end with \n\n
writer.flush();
System.out.println("This is i : " + i);
if(i == 4) {
writer.write("event: close \n");
}
if(rnd1.nextInt(100) < 30)
writer.write("data: "+"{\"Messages\": [{\"Msg\":\"Success1\"}]}"+"\n\n");
else
writer.write("data: "+"{\"Messages\": [{\"Msg\":\"Success2\"}]}"+"\n\n");
try {
Thread.sleep(rnd2.nextInt(3000));
} catch (InterruptedException e) {
e.printStackTrace();
}
}
writer.close();
一旦循環達到4,它應該停止,但是它會不斷地重新發送消息。 為了證明這一點,我打印了計數器i,以查看這是否正確,並且實際上它打印如下:
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4
THis is i : 0
THis is i : 1
THis is i : 2
THis is i : 3
THis is i : 4
有人知道我在做什么錯嗎? 我真的被卡住了。 非常感謝你。
通過保持PrintWriter處於打開狀態,可以抽象出服務器已發送事件通道,當新數據到達客戶端時,可以以各種方式將其發送到客戶端。
為了能夠將數據發送到客戶端,寫PrintWriter的操作可能應該與上面的響應邏輯分開(以避免阻塞更好地用於答復新的傳入Web請求的線程)。
建議將PrintWriter通道保留在會話變量中,並使用完全不同的服務來調度和寫出消息,例如,通過在ScheduledExecutorService中為每個用戶/打印作者調度一個Executor,該Executor發送一些消息,然后終止該消息。執行程序,保持PrintWriter打開直到超時。
我發現問題是我沒有正確關閉源事件。 問題在於源事件沒有關閉,因此客戶端一直都在監聽相同的消息。 關閉事件源即可解決問題! :)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.