Ich habe eine rudimentäre Java-Anwendung geschrieben, um SSE (server-sent events) zu verwenden, die von einem Node.js-Server mit dem Jersey SSE-Client gestreamt wurden. Ich kann die Ereignisse jedoch nicht empfangen. Um zu überprüfen, die Server-Komponente wie erwartet funktioniert, ich habe die curl
wie folgt verwendet:Jersey SSE-Client empfängt keine Ereignisse
curl -v -H "Accept: text/event-stream" http://localhost:8080/events/
ich die folgende Antwort erhalten:
* Trying ::1...
* Connected to localhost (::1) port 8080 (#0)
> GET /events/ HTTP/1.1
> Host: localhost:8080
> User-Agent: curl/7.43.0
> Accept: text/event-stream
>
< HTTP/1.1 200 OK
< X-Powered-By: Express
< Content-Type: text/event-stream
< Cache-Control: no-cache
< Connection: keep-alive
< Date: Wed, 26 Apr 2017 17:12:00 GMT
< Transfer-Encoding: chunked
<
event: ping
data: 0.6637400726922664
event: ping
data: 0.8538157046725585
Der Code für mein SSE-Client in Java wird wie folgt (Java 8, Jersey-Client 1.19.3, Jersey Medien SSE 2.25.1):
import org.glassfish.jersey.media.sse.EventListener;
import org.glassfish.jersey.media.sse.EventSource;
import org.glassfish.jersey.media.sse.InboundEvent;
import org.glassfish.jersey.media.sse.SseFeature;
import javax.ws.rs.client.Client;
import javax.ws.rs.client.ClientBuilder;
import javax.ws.rs.client.WebTarget;
public class NodeCaptureSSE {
public static void main(String[] args) {
Client client = ClientBuilder.newBuilder().register(SseFeature.class).build();
WebTarget target = client.target("http://localhost:8080/events/");
EventSource eventSource = EventSource.target(target).build();
EventListener listener = new EventListener() {
@Override
public void onEvent(InboundEvent inboundEvent) {
System.out.println(inboundEvent.getName() + "; " + inboundEvent.readData(String.class));
}
};
eventSource.register(listener, "ping");
eventSource.open();
System.out.println("Connected to SSE source...");
try {
Thread.sleep(25_000);
}
catch (InterruptedException ie) {
System.err.println("Exception: " + ie.getMessage());
}
eventSource.close();
System.out.println("Closed connection to SSE source");
}
}
der einzige Ausgang ich auf dem Bildschirm zu sehen ist:
Connected to SSE source...
gefolgt von einem Ausgang, nach 25 Sekunden. Da der Server benannte Ereignisse ("ping") streamt, habe ich dies beim Registrieren des Listeners für die Ereignisquelle angegeben. Das Auslassen des zweiten Parameters an die eventSource.register(...);
hat nichts getan, obwohl ich das nicht erwartet habe. Ich habe auch die Endung /
in der URL entfernt, aber das ergibt einen 404 Not Found
(wie erwartet). Ich hoffe, dass ich irgendwelche Hinweise in die richtige Richtung bekomme.
Gibt es eine Möglichkeit, die Verbindung für längere Zeit geöffnet zu halten ?, wird Jersey Sse Client wie ein Browser funktionieren? –