Метод запуска приложения Spring Boot периодически - PullRequest
3 голосов
/ 14 октября 2019

Я играю с простым приложением Spring Boot и RabbitMQ.

Однако я не могу понять, как периодически запускать метод.

Вот мой класс Application

@SpringBootApplication
public class SampleApp {
    @Autowired
    Sender sender;

    public static void main(String[] args) {
        SpringApplication.run(SampleApp.class, args);
    }

    @EventListener(ApplicationReadyEvent.class)
    public void doSomethingAfterStartup() {
        sender.sendMessage();
    }
}

И метод sendMessage определяется следующим образом:

@Scheduled(fixedRate = 3000L)
public void sendMessage() {
    log.info("Sending message...");
    rabbitTemplate.convertAndSend("my-exchange", "my-routing-key", "TEST MESSAGE");
}

Однако этот метод вызывается только один раз, я вижу только одну строку в консоли.

Что я пропустил в своем коде?

Спасибо.

Ответы [ 3 ]

2 голосов
/ 14 октября 2019

Похоже, вам не хватает @EnableScheduling:

@EnableScheduling
@SpringBootApplication
public class SampleApp {
    ...
}

Цитирование документации:

Включает возможность выполнения запланированных задач Spring, аналогично функциональностинаходится в <task:*> пространстве имен Spring. Для использования в классах @Configuration следующим образом:

@Configuration
@EnableScheduling
public class AppConfig {

     // various @Bean definitions
}

Это позволяет обнаруживать аннотации @Scheduled для любого bean-управляемого компонента в контейнере.

1 голос
/ 14 октября 2019

Чтобы работать с запланированными задачами в SpingBoot, нам нужно указать каркасу настроить планировщики и потоки. Вы пропустили единственную аннотацию в определении основного класса - @EnableScheduling.

Поэтому добавьте ее в свой класс следующим образом:

@SpringBootApplication
@EnableScheduling
public class SampleApp {
    @Autowired
    Sender sender;

    public static void main(String[] args) {
        SpringApplication.run(SampleApp.class, args);
    }

    @EventListener(ApplicationReadyEvent.class)
    public void doSomethingAfterStartup() {
        sender.sendMessage();
    }
}

И планирование начнет работать нормально)

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

0 голосов
/ 14 октября 2019

Я обычно использую Spring ThreadPoolTaskScheduler. Вы определяете это, например, как Бин, затем заключаете свой метод в Runnable и вызываете его с интервалами, определенными CronTrigger. Результат можно получить с помощью ScheduledFuture

Проверка https://www.baeldung.com/spring-task-scheduler для полного учебника для начинающих.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...