Java WebSocket对接印度股票数据API实战指南
·
📈 Java WebSocket对接印度股票数据API实战指南
技术栈:Java 17 + Spring Boot 3.2 + WebSocket + Resilience4j
适用场景:量化交易系统、实时行情监控、金融数据分析平台
🔍 一、印度股票数据源特点与对接价值
-
核心数据源
- NSE(国家交易所):占印度90%交易量,主力指数Nifty 50
- BSE(孟买交易所):亚洲历史最悠久的交易所,代表指数Sensex 30
- 交易时段:IST 9:15-15:30(UTC+5:30),含午休12:00-12:15
-
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 |
📚 资源与提示
-
调试工具
- 使用https://websocket.org/echo.html验证连接
- 开启DEBUG日志:
logging.level.org.java_websocket=DEBUG
-
关键注意事项
- 时区处理:所有时间戳需转换到IST时区(
Asia/Kolkata) - 节假日兼容:跳过印度市场休市日(如Diwali)
- 限流策略:遵守API调用限制(通常100次/分钟)
- 时区处理:所有时间戳需转换到IST时区(
遇到问题? 欢迎在评论区留言交流! 👇
更多推荐



所有评论(0)