Tinkoff / invest-api-java-sdk

Tinkoff Invest API Java SDK
Apache License 2.0
76 stars 21 forks source link

Не приходят данные по подписке #47

Closed KachkoBart closed 1 year ago

KachkoBart commented 1 year ago
StreamProcessor<MarketDataResponse> processor = response -> {
            if (response.hasCandle()) {
                log.info("Новые данные по свечам: {}", response);
            } else if (response.hasSubscribeCandlesResponse()) {
                var successCount = response.getSubscribeCandlesResponse().getCandlesSubscriptionsList().stream().filter(el -> el.getSubscriptionStatus().equals(SubscriptionStatus.SUBSCRIPTION_STATUS_SUCCESS)).count();
                var errorCount = response.getSubscribeTradesResponse().getTradeSubscriptionsList().stream().filter(el -> !el.getSubscriptionStatus().equals(SubscriptionStatus.SUBSCRIPTION_STATUS_SUCCESS)).count();
                log.info("удачных подписок на свечи: {}", successCount);
                log.info("неудачных подписок на свечи: {}", errorCount);
            }
        };
        Consumer<Throwable> onErrorCallback = error -> log.error(error.toString());
        marketDataStreamService.newStream("candles_stream", processor, onErrorCallback).subscribeCandles(List.of(figi));

Сделал как в примере, но после запуска приложение не встает в режим ожидания, а завершается. Проверял, когда биржа работала и инструмент был доступен для торгов.

KachkoBart commented 1 year ago

может ли быть проблема в том, что я использовал песочницу?

SRadyukov commented 1 year ago

вы используете асинхронное api которое не переводит в режим ожидания и не блокируется. вы можете сделать Thread.sleep в управляющем потоке, или например сигнал c помощью CountDownLatch

int  N = 1000;
CountDownLatch doneSignal = new CountDownLatch(N);
StreamProcessor<MarketDataResponse> processor = response -> {
  log.info("message: {}", response);
  doneSignal.countDown();
};
Consumer<Throwable> onErrorCallback = error -> log.error(error.toString());
marketDataStreamService.newStream("candles_stream", processor, onErrorCallback).subscribeCandles(List.of(figi));
doneSignal.await(); //wait to N received messages
AlexanderVolkovTCS commented 1 year ago

спасибо @SRadyukov, @KachkoBart если будут вопросы - переоткройте тикет.