2015-05-23 6 views
7

से कनेक्ट नहीं होगा मैं नया (संस्करण 4.2 के रूप में) जावा STOMP क्लाइंट समर्थन के साथ खेल रहा हूं। मेरा प्रारंभिक बिंदु प्रारंभ करना मार्गदर्शिका है (Using WebSocket to build an interactive web application)।WebSocketStompClient SockJS एंडपॉइंट

निम्नलिखित endpoint उदाहरण में प्रदान की जाती है:

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

मैं सफलतापूर्वक ब्राउज़र क्लाइंट का उपयोग कनेक्ट कर सकते हैं। का उपयोग करते समय stomp जावा ग्राहक का उपयोग कर इस समाप्ति बिंदु को कनेक्ट करने का प्रयास करें: आगे की जांच करने पर

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]

मैं सर्वर endpoint विन्यास बदल TomcatWebSocketTestServer.java के आधार पर:

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

मैं निम्नलिखित अपवाद का सामना StompWebSocketIntegrationTests.java में इस्तेमाल इस प्रकार है:

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

मैं अब कनेक्ट कर सकते हैं, लेकिन ब्राउज़र ग्राहकों नहीं कर सकता।

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

अगर मैं .withSockJs जोड़ने() endpoint विन्यास करने के लिए:

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

ब्राउज़र ग्राहकों को फिर से कनेक्ट कर सकते हैं, लेकिन जावा ग्राहक वापस मूल त्रुटि है।

क्या मुझे दोनों ग्राहकों के बीच एक ही अंतराल साझा करने में सक्षम होना चाहिए या क्या मुझे इस मामले में दो अलग-अलग अंतराल को कॉन्फ़िगर करने की आवश्यकता है?

उत्तर

15

निम्नलिखित विन्यास काम करता है:

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

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

सुनिश्चित नहीं हैं कि अगर इस डिजाइन से (एक ही पथ के साथ अर्थात दो समाप्ति बिंदुओं) क्या है?

एक बेहतर ब्रायन-Clozel की प्रतिक्रिया के आधार पर समाधान जब WebSocketStompClient को विन्यस्त एक परिवहन के रूप में जावा SockJsClient उपयोग करने के लिए है:

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

जो केवल एक ही endpoint के उपयोग की अनुमति देता है जो जावा और जावास्क्रिप्ट ग्राहक भी कर सकते करने के लिए दोनों कनेक्ट:

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

रूप the reference documentation में कहा गया है: जब SockJS को सक्षम करने, कई परिवहन आप के लिए कॉन्फ़िगर किया गया है। सबसे पहले, ग्राहक एक "GET /info" अनुरोध समर्थित परिवहन के बारे में पता करने के लिए भेजता है और फिर अपनी क्षमताओं के आधार पर एक अनुरोध भेजता है:

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

अब आप के लिए आप "/hello" endpoint आपके विन्यास नकल करने की जरूरत नहीं है। आप सीधे वेबसाइकिल एंडपॉइंट का उपयोग करना चाहते हैं, या बेहतर, वेब सॉकेटजेड क्लाइंट का उपयोग वेबस्केट ट्रांसपोर्ट के साथ करें। the complete example in the reference documentation देखें।

+0

धन्यवाद, आपका उत्तर सहायक था। मैंने आपकी प्रतिक्रिया के आधार पर नई प्रतिक्रिया के साथ अपना उत्तर अपडेट कर दिया है। क्षमा करें मैं अभी तक ऊपर नहीं जा सकता (पर्याप्त प्रतिष्ठा अंक नहीं)। – stacktrace

संबंधित मुद्दे