Я пытаюсь создать приложение SpringBoot, которое будет использовать данные стороннего REST API и отправлять уведомления Websocket моим собственным клиентам на основе событий / изменений этих данных.Данные, которые я использую, часто меняются, иногда десятки раз в секунду (колебания цен криптовалюты ведут себя аналогично этим данным).Я хочу многократно вызывать API через фиксированный интервал (например, каждые 1-10 секунд), наблюдать за определенными событиями / изменениями и инициировать push Websocket, когда эти события происходят.
Я смог построитьпростое приложение Spring Boot, которое может отправлять уведомления Websocket и использовать API, выполняя следующие инструкции:
Проблема: Я могу только заставить приложение запрашивать данные у API один раз .Я потратил часы на поиск каждого варианта «Spring RestTemplate многократных / повторных / постоянных вызовов», о котором я могу думать, но я не могу найти решение, которое бы соответствовало моему конкретному использованию.Самые близкие примеры, которые я нашел, используют повторные попытки, но даже те, в конце концов, сдадутся.Я хочу, чтобы мое приложение постоянно запрашивало эти данные, пока я не закрою приложение.Я знаю, что мог бы обернуть его в оператор while(true)
или что-то в этом роде, но на самом деле это не подходит для такой среды, как SpringBoot, и все еще возникают проблемы при попытке создать экземпляр RestTemplate.
Как я могуреализовать постоянный запрос ресурса RESTful API?
Ниже приведено то, что я имею в своем классе приложения
import org.springframework.boot.CommandLineRunner;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.client.RestTemplateBuilder;
import org.springframework.context.annotation.Bean;
import org.springframework.scheduling.annotation.EnableScheduling;
import org.springframework.web.client.RestTemplate;
@SpringBootApplication
@EnableScheduling
public class Application {
private static final String API_URL = "http://hostname.com/api/v1/endpoint";
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
@Bean
RestTemplate restTemplate(RestTemplateBuilder builder){
return builder.build();
}
@Bean
public CommandLineRunner run(RestTemplate restTemplate) throws Exception {
return args -> {
Response response= restTemplate.getForObject(API_URL, Response.class);
System.out.println(response.toString());
};
}
}