WebSocketStompClient stellt keine Verbindung zum SockJS-Endpunkt her
Ich spiele mit der neuen (ab Version 4.2) Java STOMP-Client-Unterstützung herum. Mein Ausgangspunkt ist die Kurzanleitung Mit WebSocket eine interaktive Webanwendung erstellen).
Der folgende Endpunkt wird im Beispiel bereitgestellt:
@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
registry.addEndpoint("/hello").withSockJS();
}
Ich kann mit dem Browser-Client erfolgreich eine Verbindung herstellen. Wenn Sie versuchen, mit dem Java-Stomp-Client eine Verbindung zu diesem Endpunkt herzustellen, gehen Sie wie folgt vor:
WebSocketClient transport = new StandardWebSocketClient();
WebSocketStompClient stompClient = new WebSocketStompClient(transport);
stompClient.setMessageConverter(new StringMessageConverter());
String url = "ws://127.0.0.1:8080/hello";
ListenableFuture<StompSession> future = stompClient.connect(url,myHandler);
Ich stoße auf die folgende Ausnahme:
08:56:30.629 [SimpleAsyncTaskExecutor-1] DEBUG o.s.m.simp.stomp.DefaultStompSession - Failed to connect session id=4e6737da-8f68-691d-375f-9e46f48bc149 javax.websocket.DeploymentException: The HTTP response from the server [HTTP/1.1 200 OK ] did not permit the HTTP upgrade to WebSocket at org.apache.tomcat.websocket.WsWebSocketContainer.parseStatus(WsWebSocketContainer.java:637) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.apache.tomcat.websocket.WsWebSocketContainer.processResponse(WsWebSocketContainer.java:621) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.apache.tomcat.websocket.WsWebSocketContainer.connectToServer(WsWebSocketContainer.java:309) ~[tomcat-embed-websocket-8.0.20.jar:8.0.20] at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:152) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT] at org.springframework.web.socket.client.standard.StandardWebSocketClient$1.call(StandardWebSocketClient.java:149) ~[spring-websocket-4.2.0.BUILD-SNAPSHOT.jar:4.2.0.BUILD-SNAPSHOT] at java.util.concurrent.FutureTask.run(Unknown Source) [na:1.8.0] at java.lang.Thread.run(Unknown Source) [na:1.8.0]
Nach weiteren Untersuchungen habe ich die Server-Endpunktkonfiguration basierend auf TomcatWebSocketTestServer.java, die in StompWebSocketIntegrationTests.java verwendet wird, wie folgt geändert:
RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
.setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
.setAllowedOrigins("*");
Ich kann jetzt eine Verbindung herstellen, die Browser-Clients jedoch nicht.
GET http://localhost:8080/hello/info 404 (Not Found)
Wenn ich der Endpunktkonfiguration .withSockJs () hinzufüge:
RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy();
registry.addEndpoint("/hello")
.setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy))
.setAllowedOrigins("*")
.withSockJs();
Die Browser-Clients können erneut eine Verbindung herstellen, der Java-Client kehrt jedoch zum ursprünglichen Fehler zurück.
Sollte ich in der Lage sein, denselben Endpunkt für beide Clients freizugeben, oder muss ich in diesem Fall zwei separate Endpunkte konfigurieren?