📈 Java WebSocket对接印度股票数据API实战指南

技术栈:Java 17 + Spring Boot 3.2 + WebSocket + Resilience4j
适用场景:量化交易系统、实时行情监控、金融数据分析平台


🔍 一、印度股票数据源特点与对接价值
  1. 核心数据源

    • NSE(国家交易所):占印度90%交易量,主力指数Nifty 50
    • BSE(孟买交易所):亚洲历史最悠久的交易所,代表指数Sensex 30
    • 交易时段:IST 9:15-15:30(UTC+5:30),含午休12:00-12:15
  2. WebSocket优势

    • 毫秒级延迟:实时推送价格变动,避免HTTP轮询开销
    • 双向通信:支持批量订阅多只股票(如Nifty 50成分股)
    • 高并发支持:单连接可处理数百只股票数据流

⚙️ 二、环境准备与依赖配置
1. Maven依赖
<dependencies>
    <!-- WebSocket客户端 -->
    <dependency>
        <groupId>org.java-websocket</groupId>
        <artifactId>Java-WebSocket</artifactId>
        <version>1.5.3</version>
    </dependency>
    <!-- JSON解析 -->
    <dependency>
        <groupId>com.google.code.gson</groupId>
        <artifactId>gson</artifactId>
        <version>2.10.1</version>
    </dependency>
    <!-- 连接池管理 -->
    <dependency>
        <groupId>org.apache.httpcomponents.client5</groupId>
        <artifactId>httpclient5</artifactId>
        <version>5.3</version>
    </dependency>
</dependency>
2. API密钥配置
  • 从https://api.stocktv.top获取密钥(格式:MY4b781f618e3f43c4b055f25fa61941ad
  • 安全提示:密钥避免硬编码,推荐使用环境变量或Vault存储

💻 三、WebSocket客户端核心实现
1. 建立连接与订阅消息
import org.java_websocket.client.WebSocketClient;
import org.java_websocket.handshake.ServerHandshake;
import java.net.URI;

public class IndiaStockWSClient extends WebSocketClient {
    private final String apiKey;

    public IndiaStockWSClient(URI serverUri, String apiKey) {
        super(serverUri);
        this.apiKey = apiKey;
    }

    @Override
    public void onOpen(ServerHandshake handshake) {
        System.out.println("Connected to StockTV API");
        // 订阅Nifty 50指数和头部股票
        String subscribeMsg = "{ \"action\":\"subscribe\", \"pids\":[17940,41602,7310] }";
        this.send(subscribeMsg);
    }

    @Override
    public void onMessage(String message) {
        // 解析实时行情(示例格式)
        // {"pid":41602,"symbol":"TCS","last":3856.75,"chgPct":0.32}
        System.out.println("Received: " + message);
        // 此处添加业务逻辑处理
    }

    @Override
    public void onClose(int code, String reason, boolean remote) {
        System.out.println("Connection closed: " + reason);
    }

    @Override
    public void onError(Exception ex) {
        ex.printStackTrace();
    }
}
2. 启动客户端
public class App {
    public static void main(String[] args) throws Exception {
        String apiKey = System.getenv("STOCKTV_API_KEY");
        String wsUrl = "wss://ws-api.stocktv.top/connect?key=" + apiKey;
        IndiaStockWSClient client = new IndiaStockWSClient(new URI(wsUrl), apiKey);
        client.connect();
    }
}

🚀 四、高级功能实现
1. 断线自动重连
@Override
public void onClose(int code, String reason, boolean remote) {
    System.out.println("Connection closed. Attempting reconnect...");
    new Thread(() -> {
        try {
            Thread.sleep(5000); // 5秒后重试
            this.reconnectBlocking();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }).start();
}
2. 心跳机制保活
@Override
public void onOpen(ServerHandshake handshake) {
    // ...订阅代码...
    // 启动心跳线程
    new Thread(() -> {
        while (isOpen()) {
            try {
                Thread.sleep(30000); // 每30秒发送心跳
                send("{ \"type\":\"ping\" }");
            } catch (InterruptedException e) {
                break;
            }
        }
    }).start();
}
3. 多股票批量订阅
public void subscribeStocks(List<Integer> pids) {
    JSONObject msg = new JSONObject();
    msg.put("action", "subscribe");
    msg.put("pids", pids); // 如[41602,7310,992844]
    this.send(msg.toString());
}

⚠️ 五、生产环境最佳实践
1. 安全加固
  • 强制WSS:仅使用wss://协议加密传输
  • 密钥轮换:每月更新API Key,避免泄露风险
2. 性能优化
优化项 配置建议 效果
连接池大小 MaxConnPerRoute=20, Total=100 避免连接风暴
消息压缩 启用permessage-deflate 减少带宽消耗30%+
本地缓存 Redis缓存静态数据(如股票PID) 降低API调用频次
3. 错误处理策略
// 熔断降级(Resilience4j)
@CircuitBreaker(name = "stockApi", fallbackMethod = "fallbackHandler")
public void processRealTimeData(String message) {
    // 业务逻辑
}

private void fallbackHandler(String message, Throwable t) {
    // 1. 记录错误日志
    // 2. 切换备用数据源
    // 3. 发送告警通知
}

💎 六、完整实战示例:Nifty50实时监控
// 步骤1:初始化WebSocket客户端
IndiaStockWSClient client = new IndiaStockWSClient(
    new URI("wss://ws-api.stocktv.top/connect?key=YOUR_KEY"),
    "YOUR_KEY"
);

// 步骤2:订阅Nifty50成分股(从StockTV接口获取PID列表)
List<Integer> nifty50Pids = Arrays.asList(17940, 41602, 7310, ...);
client.subscribeStocks(nifty50Pids);

// 步骤3:实时数据存储到数据库
@Override
public void onMessage(String message) {
    JSONObject data = new JSONObject(message);
    String symbol = data.getString("symbol");
    double price = data.getDouble("last");
    // 存入MySQL或时序数据库
    stockDao.insertRealtimePrice(symbol, price);
}

性能测试对比(单节点)
场景 HTTP轮询(1s间隔) WebSocket
连接数 50 1
日均请求量 4.32M 0.02M
平均延迟 300-800ms <50ms

📚 资源与提示
  1. 调试工具

    • 使用https://websocket.org/echo.html验证连接
    • 开启DEBUG日志:logging.level.org.java_websocket=DEBUG
  2. 关键注意事项

    • 时区处理:所有时间戳需转换到IST时区(Asia/Kolkata
    • 节假日兼容:跳过印度市场休市日(如Diwali)
    • 限流策略:遵守API调用限制(通常100次/分钟)

GitHub示例仓库

遇到问题? 欢迎在评论区留言交流! 👇

Logo

Agent 垂直技术社区,欢迎活跃、内容共建。

更多推荐