Tinkoff / invest-openapi-java-sdk

Apache License 2.0
167 stars 46 forks source link

Не срабатывает unsubscribe запрос #112

Closed Serj1032 closed 3 years ago

Serj1032 commented 3 years ago

Тестировал на sandbox подписку и отписку события свечей.

...
Thread.sleep(5000);
api.getStreamingContext().sendRequest(StreamingRequest.subscribeCandle("BBG004730N88", CandleInterval.ONE_MIN));
Thread.sleep(10000);
api.getStreamingContext().sendRequest(StreamingRequest.unsubscribeCandle("BBG004730N88", CandleInterval.ONE_MIN));
Thread.sleep(30000);`
api.close();
...

Добавил логирование и увидел

[2020-12-23 13:55:21.918] [WARNING] ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl sendRequest 
SendRequest: {"event":"candle:subscribe","requestId":null,"figi":"BBG004730N88","interval":"1min"}
wsClientIndex: 0
[2020-12-23 13:55:21.953] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.82, highestPrice = 263.82, lowestPrice = 263.76, tradingValue = 505, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
[2020-12-23 13:55:22.661] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.82, highestPrice = 263.82, lowestPrice = 263.76, tradingValue = 508, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
...
[2020-12-23 13:55:24.888] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.85, highestPrice = 263.85, lowestPrice = 263.76, tradingValue = 1142, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
[2020-12-23 13:55:31.416] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.81, highestPrice = 263.85, lowestPrice = 263.76, tradingValue = 1159, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
[2020-12-23 13:55:31.921] [WARNING] ru.tinkoff.invest.openapi.okhttp.StreamingContextImpl sendRequest 
SendRequest: {"event":"candle:unsubscribe","requestId":null,"figi":"BBG004730N88","interval":"1min"}
wsClientIndex: : 3
[2020-12-23 13:55:44.373] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.85, highestPrice = 263.85, lowestPrice = 263.76, tradingValue = 2159, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
[2020-12-23 13:55:44.477] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.86, highestPrice = 263.86, lowestPrice = 263.76, tradingValue = 2964, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)
[2020-12-23 13:55:46.908] [INFO   ] ru.tinkoff.sergey.stock.StreamingApiSubscriber whenNext 
Пришло новое событие из Streaming API
Candle(openPrice = 263.76, closingPrice = 263.84, highestPrice = 263.86, lowestPrice = 263.76, tradingValue = 2965, dateTime = 2020-12-23T10:55Z[UTC], interval = ONE_MIN, figi = BBG004730N88)

События продолжают приходить после отправки запроса unsubscribe.

Предположительно не работает из за того, что запрос на подписку отправляется из другого wsClient. Помогает следующий фикс (возможно проблема глубже, поправьте меня)

// final int clientIndex = request.hashCode() % this.wsClients.length;
final int clientIndex = request.onOffPairId().hashCode() % this.wsClients.length;
leodev87 commented 3 years ago

При отрицательном результате request.onOffPairId().hashCode() мы получим отрицательный clientIndex. Что приведет к ArrayIndexOutOfBoundsException image

Столкнулся с аналогичной проблемой по отпискам, решил как вы, но обернул в Math.abs() Так же не совсем понятно почему мы плодим AsyncSubscriber и они не гасятся при отписке