2015-05-23 12 views
7

Yeni (sürüm 4.2 sürümü) java STOMP istemci desteğiyle oynarım. Başlangıç ​​noktam başlangıç ​​kılavuzudur (Using WebSocket to build an interactive web application).WebSocketStompClient, SockJS bitiş noktasına bağlanmayacak

aşağıdaki uç nokta örnekte sağlanır: başarıyla tarayıcı istemcisi kullanarak bağlayabilirsiniz

@Override 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/hello").withSockJS(); 
} 

. kullanarak java Stomp istemcisi kullanarak bu bitiş noktasına bağlanmaya çalışılırken aşağıdaki:

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]

Araştırmamız sonucunda Sunucu son nokta ayarlarını değiştirmiş TomcatWebSocketTestServer.java dayalı:

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); 

Ben şu istisna karşılaşmak

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy(); 
registry.addEndpoint("/hello") 
    .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy)) 
    .setAllowedOrigins("*"); 

şimdi bağlanabilir, ancak tarayıcı istemcileri olamaz: StompWebSocketIntegrationTests.java kullanılan aşağıdaki gibi. tarayıcı istemcileri tekrar bağlanabilir

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy(); 
registry.addEndpoint("/hello") 
    .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy)) 
    .setAllowedOrigins("*") 
    .withSockJs(); 

ama java istemci tekrar orijinal hata şudur:

GET http://localhost:8080/hello/info 404 (Not Found) 

Ben son nokta yapılandırmasına() .withSockJs eklerseniz.

Aynı son noktayı iki istemci arasında paylaşabilmeli miyim veya bu durumda iki ayrı uç noktayı yapılandırmalı mıyım?

cevap

15

aşağıdaki yapılandırma çalışmaları:

RequestUpgradeStrategy upgradeStrategy = new TomcatRequestUpgradeStrategy(); 
registry.addEndpoint("/hello") 
     .withSockJS(); 

registry.addEndpoint("/hello") 
     .setHandshakeHandler(new DefaultHandshakeHandler(upgradeStrategy)) 
     .setAllowedOrigins("*"); 

bu tasarımla (aynı yolla yani iki uç noktası) olup olmadığından emin değil misiniz? Brian-Clozel en görüşlere göre

daha iyi bir çözüm WebSocketStompClient yapılandırılırken bir ulaşım olarak Java SockJsClient kullanmaktır: tek bir uç nokta kullanımına olanak

List<Transport> transports = new ArrayList<>(1); 
transports.add(new WebSocketTransport(new StandardWebSocketClient())); 
WebSocketClient transport = new SockJsClient(transports); 
WebSocketStompClient stompClient = new WebSocketStompClient(transport); 

olan Java ve JavaScript iç istemcileri için Her iki bağlantı:

@Override 
public void registerStompEndpoints(StompEndpointRegistry registry) { 
    registry.addEndpoint("/hello").withSockJS(); 
} 
4

the reference documentation belirtildiği gibi: SockJS etkinleştirirken, çoklu nakliye sizin için yapılandırılır. İlk olarak, istemci desteklenen taşıma hakkında bilmek bir "GET /info" isteği gönderir ve daha sonra kendi özelliklerine bağlı olarak bir istek gönderir:

"http://host:port/myApp/myEndpoint/{server-id}/{session-id}/{transport}" 

Şimdi de "/hello" son nokta için yapılandırmayı çoğaltmak gerekmez. Websocket uç noktasını doğrudan kullanmayı veya daha iyi bir şekilde, Java SockJS istemcisini bir web bağlantısıyla kullanmayı tercih edersiniz. Bkz the complete example in the reference documentation.

+0

Teşekkürler, cevabınız yardımcı oldu. Cevabımı, geri bildiriminize dayanarak yeni yapılandırmayla güncelledim. Üzgünüm, henüz cevaplayamıyorum (yeterli itibar puanı yok). – stacktrace

İlgili konular