2016-05-17 9 views
0

Im serverseitigen Ereignis stellt die Ereignisquelle eine Verbindung zu einem Server über eine HTTP-Verbindung her und empfängt Ereignisse im Text-/Ereignisstromformat, ohne die Verbindung gemäß der MDN-Dokumentation zu schließen.Serverseitige Ereignisverbindungsproblem

https://developer.mozilla.org/en-US/docs/Web/API/EventSource

Ich habe den folgenden Code -

/** 
 
* 
 
*/ 
 

 
(function(){ 
 
\t "use strict" 
 
\t var init = function(){ 
 
\t \t if (window.EventSource) { 
 
\t \t \t console.log("Event source available"); 
 
\t \t \t var source = new EventSource('/message'); 
 

 
\t \t \t source.addEventListener('message', function(e) { 
 
\t \t \t  var container = document.getElementById("container"); 
 
\t \t \t  container.innerHTML += e.data; 
 
\t \t \t }); 
 

 
\t \t \t source.addEventListener('open', function(e) { 
 
\t \t \t   console.log("Connection was opened."); 
 
\t \t \t }, false); 
 

 
\t \t \t source.addEventListener('error', function(e) { 
 
\t \t \t   if (e.readyState == EventSource.CLOSED) { 
 
\t \t \t    console.log("Connection was closed."); 
 
\t \t \t   } else { 
 
\t \t \t    console.log(e.readyState);  
 
\t \t \t   } 
 
\t \t \t }, false); 
 
\t \t \t } else { 
 
\t \t \t   console.log("No SSE available"); 
 
\t \t \t } 
 
\t } 
 
\t init(); 
 
\t 
 
})();
<!DOCTYPE html> 
 
<html> 
 
<head> 
 
<title>Index file</title> 
 
<script type="text/javascript" src="js/ssescript.js"></script> 
 
</head> 
 
<body> 
 
\t This is the index file. 
 
\t <div id="container"></div> 
 
</body> 
 
</html>

und auf Server-Seite Ich bin mit Spring MVC

package com.example.controller; 

import java.util.Random; 

import javax.servlet.http.HttpServletResponse; 

import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RestController; 


@RestController 
public class AppController { 


    @RequestMapping("/message") 
    public String getMessage(HttpServletResponse response){ 
     response.setContentType("text/event-stream"); 
     Random r = new Random(); 
     return "data:Testing 1,2,3 "+r.nextInt()+"\n\n"; 
    } 

} 

Jedes Mal, wenn der Browser ein eröffnet neue Verbindung und schließe es. Können wir die EventSource-Verbindung nur einmal öffnen und die Daten vom Server pushen?

+0

Scheint Unterstützung von Browser zu müssen;) – Blank

+0

Ich versuchte es mit Google Chrome 50.0.2661.102 –

+0

Was über das Hinzufügen von '' @ResponseBody zu Ihre Controller-Methode? – Blank

Antwort

0

Ich lief in diesen gleichen Fehler.

Nach vielen Versuchen fand ich, dass Tomcat die Verbindung aufgrund einer Standardeinstellung im Frühjahr schloss. Ich habe das Async-Anforderungstimeout auf eine Nummer festgelegt, die groß genug ist, um meine Anforderungen zu erfüllen.

spring.mvc.async.request-timeout = (einige wirklich große Zahl)