| | |
| | | |
| | | private final List<OkxChannelHandler> channelHandlers = new ArrayList<>(); |
| | | |
| | | private volatile Runnable onLoginSuccess; |
| | | |
| | | public WebSocketClient getWebSocketClient() { |
| | | return webSocketClient; |
| | | } |
| | | |
| | | public void setOnLoginSuccess(Runnable onLoginSuccess) { |
| | | this.onLoginSuccess = onLoginSuccess; |
| | | } |
| | | |
| | | private final ExecutorService sharedExecutor = Executors.newCachedThreadPool(r -> { |
| | |
| | | |
| | | JSONObject login = OkxWsUtil.buildJsonObject(null, "login", argsArray); |
| | | webSocketClient.send(login.toJSONString()); |
| | | log.info("[WS] 发送登录请求"); |
| | | } catch (Exception e) { |
| | | log.error("[WS] 登录请求构建失败", e); |
| | | } |
| | |
| | | handler.subscribe(webSocketClient); |
| | | } |
| | | sendPing(); |
| | | if (onLoginSuccess != null) { |
| | | onLoginSuccess.run(); |
| | | } |
| | | } else { |
| | | log.error("[WS] WebSocket登录失败, code:{}, msg:{}", code, response.getString("msg")); |
| | | } |
| | | return; |
| | | } |
| | | if ("subscribe".equals(event)) { |
| | | log.info("[WS] 订阅成功: {}", response.getJSONObject("arg")); |
| | | return; |
| | | } |
| | | if ("unsubscribe".equals(event)) { |
| | | log.info("[WS] 取消订阅成功: {}", response.getJSONObject("arg")); |
| | | return; |
| | | } |
| | | if ("error".equals(event)) { |
| | |
| | | } |
| | | String op = response.getString("op"); |
| | | if ("order".equals(op) || "batch-orders".equals(op)) { |
| | | log.info("[WS] 收到下单推送结果: {}", JSON.toJSONString(response.get("data"))); |
| | | JSONArray dataArr = response.getJSONArray("data"); |
| | | if (dataArr != null && !dataArr.isEmpty()) { |
| | | JSONObject first = dataArr.getJSONObject(0); |
| | | String sCode = first.getString("sCode"); |
| | | if (sCode != null && !"0".equals(sCode)) { |
| | | log.error("[WS] 下单失败, sCode:{}, sMsg:{}", sCode, first.getString("sMsg")); |
| | | } |
| | | } |
| | | return; |
| | | } |
| | | for (OkxChannelHandler handler : channelHandlers) { |