Spring RestTemplate: Как повторно проверять Restful API Service? - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь создать приложение 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());
        };
    }
}

Ответы [ 2 ]

1 голос
/ 14 марта 2019

CommandLineRunner запускается только один раз на запуск приложения. Вместо этого вы хотите использовать аннотацию @Scheduled для выполнения повторяющихся операций с фиксированными интервалами, таких как

    @Scheduled(fixedDelay = 1000L)
    public void checkApi() {
        Response response = restTemplate.getForObject(API_URL, Response.class);
        System.out.println(response.toString())
    }

Это не обязательно должен быть Bean, это может быть просто простой метод. См. Руководство по пружине для получения дополнительной информации https://spring.io/guides/gs/scheduling-tasks/

0 голосов
/ 01 мая 2019

Добавьте @EnableScheduling аннотацию к вашему классу SpringConfig или к основному классу.

Вы можете использовать Scheduled fixedDelay ИЛИ fixedRate

@Scheduled(fixedDelay = 10000)
    public void test() {
        System.out.println("Scheduler called.");
    }

OR

@Scheduled(fixedRate  = 10000)
    public void test() {
        System.out.println("Scheduler called.");
    }

Разница между fixedDelay и fixedRate:

fixedDelay - обеспечивает задержку в n миллисекунд между временем окончания выполнения задачи и временем начала следующего выполнения задачи.

fixedRate - запускает запланированное задание каждые n миллисекунд.

В идеале вы должны выводить значение fixedDelay или fixedRate также в файле application.properties:

@Scheduled(fixedDelayString  = "${scheduler.fixed.delay}")
    public void test() {
        System.out.println("Scheduler called.");
    }

В вашем файле application.properties добавьте ниже config:

scheduler.fixed.delay = 10000

Надеюсь, это поможет.

...