Edd*_*Edd 2 java spring stomp websocket spring-websocket
我正在尝试连接到网络套接字 wss://ws-feed.gdax.com
我已经在 JavaScript 中使用了这个(见这里),但我试图将连接服务器端移动到我的 Spring Boot 应用程序中。
到目前为止,我有:
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
private Logger LOG = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) throws Exception {
WebSocketContainer container = ContainerProvider.getWebSocketContainer();
container.setDefaultMaxTextMessageBufferSize(64*1024);
WebSocketClient simpleWebSocketClient = new StandardWebSocketClient(container);
List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport(simpleWebSocketClient));
SockJsClient sockJsClient = new SockJsClient(transports);
WebSocketStompClient stompClient = new WebSocketStompClient(sockJsClient);
stompClient.setMessageConverter(new MappingJackson2MessageConverter());
LOG.info("Connecting To [wss://ws-feed.gdax.com]");
StompSession session = stompClient.connect("wss://ws-feed.gdax.com", new GDAXHandler()).get();
}
private class GDAXHandler extends WebSocketHttpHeaders implements StompSessionHandler {
@Override
public void afterConnected(StompSession session, StompHeaders connectedHeaders) {
LOG.info("Connected");
String payload = "{\"type\": \"subscribe\",\"channels\":[{\"name\": \"ticker\",\"product_ids\": [\"ETH-EUR\"]}]\"}";
LOG.info("Sending [" + payload + "]");
session.send("/", payload);
}
@Override
public void handleException(StompSession session, StompCommand command, StompHeaders headers, byte[] payload, Throwable exception) {
LOG.error("Exception", exception);
}
@Override
public void handleTransportError(StompSession session, Throwable exception) {
LOG.error("Transport Error", exception);
}
@Override
public Type getPayloadType(StompHeaders headers) {
return String.class;
}
@Override
public void handleFrame(StompHeaders headers, Object payload) {
LOG.info("Frame [" + payload + "]");
}
}
}
Run Code Online (Sandbox Code Playgroud)
如果我运行这个应用程序,输出是:
信息 Tomcat 在端口上启动:8080 (http)
信息连接到 [wss://ws-feed.gdax.com]
信息启动 ApplicationContext 时出错。要显示自动配置报告,请在启用“调试”的情况下重新运行您的应用程序。
错误传输错误org.springframework.messaging.simp.stomp.ConnectionLostException:连接关闭
引起:org.springframework.messaging.simp.stomp.ConnectionLostException:连接在 org.springframework.messaging.simp.stomp.DefaultStompSession.afterConnectionClosed(DefaultStompSession.java:487) ~[spring-messaging-4.3.13.RELEASE.RELEASE 关闭。 jar:4.3.13.RELEASE] 在 org.springframework.web.socket.messaging.WebSocketStompClient$WebSocketTcpConnectionHandlerAdapter.afterConnectionClosed(WebSocketStompClient.java:354) ~[spring-websocket-4.3.13.RELEASE.jar:4.3.13.RELEASE ] 在 org.springframework.web.socket.sockjs.client.AbstractClientSockJsSession.afterTransportClosed(AbstractClientSockJsSession.java:324) ~[spring-websocket-4.3.13.RELEASE.jar:4.3.13.RELEASE] 在 org.springframework.web .socket.sockjs.client.WebSocketTransport$ClientSockJsWebSocketHandler.afterConnectionClosed(WebSocketTransport.java:172)~[spring-websocket-4.3.13.RELEASE.jar:4.3.13.RELEASE] ...
它甚至从未进入Connected国家。我究竟做错了什么?
解决方案(感谢@ArtemBilan)是摆脱 STOMP 并使用基本的 Web 套接字,例如
@SpringBootApplication
public class DemoApplication implements CommandLineRunner {
private Logger LOG = LoggerFactory.getLogger(DemoApplication.class);
public static void main(String[] args) {
SpringApplication.run(DemoApplication.class, args);
}
@Override
public void run(String... args) {
LOG.info("Connecting To [wss://ws-feed.gdax.com]");
WebSocketConnectionManager connectionManager = new WebSocketConnectionManager(new StandardWebSocketClient(), new GDAXWebSocketHandler(), "wss://ws-feed.gdax.com");
connectionManager.start();
}
private class GDAXWebSocketHandler extends TextWebSocketHandler {
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message) {
LOG.info("Message Received [" + message.getPayload() + "]");
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
LOG.info("Connected");
String payload = "{\"type\": \"subscribe\",\"channels\":[{\"name\": \"ticker\",\"product_ids\": [\"ETH-EUR\"]}]}";
LOG.info("Sending [" + payload + "]");
session.sendMessage(new TextMessage(payload));
}
@Override
public void handleTransportError(WebSocketSession session, Throwable exception) {
LOG.error("Transport Error", exception);
}
@Override
public void afterConnectionClosed(WebSocketSession session, CloseStatus status){
LOG.info("Connection Closed [" + status.getReason() + "]");
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出日志:
INFO Tomcat started on port(s): 8080 (http)
INFO Connecting To [wss://ws-feed.gdax.com]
INFO Starting WebSocketConnectionManager
INFO Connecting to WebSocket at wss://ws-feed.gdax.com
INFO Started DemoApplication in 2.324 seconds (JVM running for 3.076)
INFO Connected
INFO Sending [{"type": "subscribe","channels":[{"name": "ticker","product_ids": ["ETH-EUR"]}]}]
INFO Successfully connected
INFO Message Received [{"type":"ticker","sequence":569701928,"product_id":"ETH-EUR","price":"641.65000000","open_24h":"465.26000000","volume_24h":"100991.88666517","low_24h":"641.65000000","high_24h":"657.17000000","volume_30d":"1129037.16627038","best_bid":"641.59","best_ask":"641.65"}]
INFO Message Received [{"type":"subscriptions","channels":[{"name":"ticker","product_ids":["ETH-EUR"]}]}]
INFO Message Received [{"type":"ticker","sequence":569702018,"product_id":"ETH-EUR","price":"641.65000000","open_24h":"465.26000000","volume_24h":"100969.00195695","low_24h":"641.65000000","high_24h":"657.17000000","volume_30d":"1129014.28156216","best_bid":"641.64","best_ask":"641.73","side":"buy","time":"2018-02-07T09:07:49.556000Z","trade_id":2980644,"last_size":"1.00879065"}]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1810 次 |
| 最近记录: |