#java #function #process #binance
Вопрос:
У меня проблема. Я использую API Binance в своем проекте. С помощью этого API я открываю поток свечей, чтобы получать последние обновления различных периодов свечей. Метод потока свечей находится в классе, который выглядит следующим образом:
public class CandlestickStream {
private String market;
private String coin;
private String period;
public CandlestickStream(String market, String coin, String period) throws SecurityException, IOException {
this.market = market;
this.coin = coin;
this.period = period;
startCandlestickEventStreaming();
}
/**
* Starting a stream to get the current candlestick data of the given symbol and period
* @param symbol The symbol you want the data from
* @param interval The period of the candlestick
* @throws IOException
* @throws SecurityException
*/
public void startCandlestickEventStreaming() throws SecurityException, IOException {
BinanceApiWebSocketClient client = BinanceApiClientFactory.newInstance().newWebSocketClient();
String symbol = createSymbolString(market, coin);
CandlestickInterval interval = periodToInterval(period);
client.onCandlestickEvent(symbol, interval, response -> {
System.out.println(response);
});
}
}
Поток запускается с использованием следующего кода:
// Loop over every market-coin-period combination and start the firstrun and stream
for (String market : markets) {
for (String coin : coins) {
for (String period : periods) {
// Run candlestick stream to monitor if it's still running
new CandlestickStream(market, coin, period);
}
}
}
Но я заметил, что binance может перезапустить сервер, что приведет к остановке функции потока, и тогда я не буду получать никаких обновлений без каких-либо ошибок. Поэтому мне нужен способ проверить, работает ли функция по-прежнему. Если нет, мне нужно перезапустить его. Как лучше всего контролировать процесс, чтобы проверить, работает ли он по-прежнему, а если нет, то перезапустить класс?
Ответ №1:
Я бы сказал, что при открытии потока создайте запись в БД (статус = INIT_READ). И после этого обновите статус (DONE_READ). Как работают пакетные задания.
И вы можете создать Планировщик для проверки состояния этой записи через каждые X промежутков времени.
С помощью этой проверки состояния при запуске сервера вы можете принять решение о том, что вам нужно сделать.
Комментарии:
1. Хорошо, я посмотрю на это. Но просто чтобы убедиться, что ты понимаешь, что мне нужно сделать…. Поток работает 24/7, мне просто нужно убедиться, что он все еще работает. Если нет, мне нужно перезапустить поток. Поток может закончиться, потому что серверы binance перезапускаются или сервер теряет соединение. Тогда это лучший подход?
2. Я пытаюсь сказать, что поток никогда не выполняется, поэтому использование статуса, я думаю, не работает, или я понимаю вас неправильно?
3. Ооо, в таком случае я бы сказал, что вам следует окружить свой звонок попыткой-наконец-то. Поэтому, когда метод будет завершен, он, наконец, войдет внутрь. И там вы можете выполнить свою операцию, чтобы отозвать/перезапустить его.
4. Что я должен окружить попыткой-наконец-то? Создание всего класса:
new CandlestickStream(market, coin, period);
или внутри класса:startCandlestickEventStreaming();
?5. На мой взгляд, новый поток свечей(рынок, монета, период); должен работать. Но вы можете попробовать в соответствии с вашими требованиями.