Wie funktioniert Server-Sent-Events arbeiten

Habe ich versucht eine SSE (Server-Sent-Events) mithilfe von java auf tomcat 8.0. Hier sind einige Dinge, die ich bemerkt.

Ich auf eine Schaltfläche klicken, können Sie automatisch eine Anfrage an das servlet. Servlet GET-Methode wird ausgeführt, das gibt ein event-stream. Sobald der stream empfangen wird, wird die Seite erneut automatisch eine weitere Anforderung, die erhält die gleichen Daten wieder!!!!! Ich glaube nicht, haben eine unendliche Schleife, die es gibt!!!

  1. Was ist eigentlich Los auf dem server? In normalen Szenarien, tomcat erstellt einen thread, behandeln jede Anfrage. Was ist jetzt passiert?
  2. Was ist der richtige Weg, um sicherzustellen, dass die event-stream nur einmal geschickt wird, um die gleiche Verbindung/browser-Sitzung?
  3. Was ist der richtige Weg, um sicherzustellen, dass der Fall abgeschlossen ist und keine Ressource overhead verursacht auf dem server?
  4. Wie die Unterscheidung zwischen GET-und POST-Anfragen. Warum hat man es sich aussuchen?
  5. Ist es zu früh, um zu verwenden, SSE auf Tomcat? Irgendwelche performance Probleme?

Hier ist der code für die neugierigen,

@WebServlet("/TestServlet")
public class TestServlet extends HttpServlet {

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //content type must be set to text/event-stream
        response.setContentType("text/event-stream"); 
        //cache must be set to no-cache
        response.setHeader("Cache-Control", "no-cache");     
        //encoding is set to UTF-8
        response.setCharacterEncoding("UTF-8");

        PrintWriter writer = response.getWriter();

        for(int i=0; i<10; i++) {
            System.out.println(i);
            writer.write("data: "+ i +"\n\n");
            writer.flush();
            try {
                Thread.sleep(3000);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
        }
        writer.close(); 
    }
}

Javascript auf der Seite (ich habe nichts anderes auf der Seite),

<button onclick="start()">Start</button>

<script type="text/javascript">
    function start() {
        var eventSource = new EventSource("TestServlet");
        eventSource.onmessage = function(event) {
            console.log("data: "+event.data)
            document.getElementById('foo').innerHTML = event.data;
        };
    }
</script>

Versucht, diese mithilfe von CURL. Und die Antwort kam nur einmal. Ich bin mit chrome, also das muss ein Problem mit chorme??

EDIT:

Was ich gelernt habe und lernen ist nun dokumentiert in meinem blog - Server Gesendeten Ereignisse

Es kann Ihr browser. versuchen Sie zum senden der ersten Anfrage mittels curl und sehen, ob es immer noch passiert.
Ja, du hast Recht. LOCKE hielt mit einer Anfrage.
Ich habe mich für das gleiche ein... zumindest war ich in der Lage, sparen Sie sich die Zeit & frustration 😉
Ich glaube nicht, dass Ihr problem mit dem browser. Ich bin mit solchem denken vom letzten 6-8 Monaten und es funktioniert gut auf die Produktion. Überprüfen Sie mit Ihrem Skript kann von start() wird immer aufgerufen, mehrere Male?
Aber wie ist das möglich? Ich kommentierte den code, und legen Sie eine Konsole.log-und es wird immer aufgerufen, nur einmal wenn ich auf die Schaltfläche klicke. Wenn Sie wurden mit dieser für Monate, dann haben Sie vielleicht Antworten auf meine Frage.

InformationsquelleAutor John | 2015-08-02

Schreibe einen Kommentar