SSE

le Streaming Simple et Efficace, sans WebSocket

MYSELF

Alexandre Victoor
Architecte à la SGCIB
alexvictoor@gmail.com
https://github.com/alexvictoor
@alex_victoor

long polling

websocket

Server Sent Event

request

GET /mystream HTTP/1.1
Host: localhost
Accept: text/event-stream
	

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream
Transfer-Encoding: chunked
 
 
 
 
 
 
 
 
 
		

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream
Transfer-Encoding: chunked

data: un premier événement, du txt ou n'importe quoi
 
 
 
 
 
 
 
	

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream
Transfer-Encoding: chunked

data: un premier événement, du txt ou n'importe quoi

data: un deuxième
data: sur
data: plusieurs
data: lignes
 
 
	

response

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream
Transfer-Encoding: chunked

data: un premier événement, du txt ou n'importe quoi

data: un deuxième
data: sur
data: plusieurs
data: lignes

data: {"msg": "un troisieme en json"}
	

En JS ?

		
var source = new EventSource("http://localhost:8081/stream");
source.onmessage = function(event) {
    // console.log(event.data);
};
		
	

metadata

id: 123
event: TaskCompleted
data: avec un id (123)
data: et un type (TaskCompleted)
	

et en JS...

		
var source = new EventSource("http://localhost:8081/stream");
source.addEventListener("TaskCompleted", function (event) {
    // console.error(event.data);
});
		
	

Recovery


id: 123
data: dernier événement reçu

===== coupure =====
 
 
 
 
 
	

Recovery


id: 123
data: dernier événement reçu

===== coupure =====

GET /mystream HTTP/1.1
Host: localhost
Accept: text/event-stream
Last-Event-ID: 123
	

retry delay

HTTP/1.1 200 OK
Connection: keep-alive
Content-Type: text/event-stream
Transfer-Encoding: chunked

retry: 5000

data: { ... }
	

Browsers

... et "browsers"

Implems en Java

  • Jetty
  • Spring
  • Undertow
  • Jersey
  • RxNetty
  • ...

Jersey

		
@GET
@Produces(SseFeature.SERVER_SENT_EVENTS)
public EventOutput getMyStream() {
  EventOutput eventOutput = new EventOutput();
  // ...
  return eventOutput
}


eventOutput.write(event);

		
	

Des limitations ?

DEMO

WEB logback

QUESTIONS