Вызов метода после запуска приложения Spring Boot - PullRequest
4 голосов
/ 26 апреля 2019

У меня есть приложение Java Spring Boot, в котором есть Планировщик, который вызывает асинхронную задачу из Службы. Задача занимает несколько минут (обычно 3-5 минут).

Тот же самый асинхронный метод из Сервиса также можно вызвать через приложение пользовательского интерфейса, вызвав API из контроллера Boot Spring.

Код:

Планировщик

@Component
public class ScheduledTasks {
  @Autowired
  private MyService myService;

  @Scheduled(cron = "0 0 */1 * * ?")
  public void scheduleAsyncTask() {
    myService.doAsync();
  }
}

Услуги

@Service
public class MyService {
  @Async("threadTaskExecutor")
  public void doAsync() {
    //Do Stuff
  }
}

Контроллер

@CrossOrigin
@RestController
@RequestMapping("/mysrv")
public class MyController {
  @Autowired
  private MyService myService;

  @CrossOrigin
  @RequestMapping(value = "/", method = RequestMethod.POST)
  public void postAsyncUpdate() {
    myService.doAsync();
  }
}

Планировщик запускает асинхронную задачу каждый час, но пользователь также может запускать ее вручную из пользовательского интерфейса.

Но я не хочу, чтобы асинхронный метод запускался снова, если он уже находится в середине выполнения.

Для этого я создал таблицу в БД, которая содержит флаг, который включается при запуске метода, а затем отключается после его завершения.

Как-то так в моем классе обслуживания:

@Autowired
private MyDbRepo myDbRepo;

@Async("threadTaskExecutor")
public void doAsync() {
  if (!myDbRepo.isRunning()) {
    myDbRepo.setIsRunning(true);
    //Do Stuff
    myDbRepo.setIsRunning(false);
  } else {
    LOG.info("The Async task is already running");
  }
}

Теперь проблема в том, что флаг иногда зависает по разным причинам (перезапуск приложения, некоторые другие ошибки приложения и т. Д.)

Итак, я хочу сбросить флаг в БД при каждом развертывании приложения весенней загрузки и при каждом перезапуске.

Как я могу это сделать? Есть ли способ запустить метод сразу после запуска Spring Boot Application, откуда я могу вызвать метод из моего репо, чтобы отменить установку флагов в базе данных?

Ответы [ 3 ]

6 голосов
/ 27 апреля 2019

Проверьте @PostConstruct, например, здесь https://www.baeldung.com/running-setup-logic-on-startup-in-spring

1 голос
/ 27 апреля 2019

Если вы хотите сделать что-то после того, как все приложение загружено и готово, используйте образец ниже из

import org.springframework.boot.context.event.ApplicationReadyEvent;
import org.springframework.context.ApplicationListener;
import org.springframework.stereotype.Component;

@Component
public class ApplicationStartup 
implements ApplicationListener<ApplicationReadyEvent> {

  /**
   * This event is executed as late as conceivably possible to indicate that 
   * the application is ready to service requests.
   */
  @Override
  public void onApplicationEvent(final ApplicationReadyEvent event) {

    // here your code ...

    return;
  }

} // class

Если этого достаточно для подключения после создания одного компонента, используйте @PostConstruct, как предложено @loan M

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

В вашем конкретном случае вам необходимо сбросить базу данных после развертывания приложения, поэтому лучший способ сделать это - использовать Spring CommandLineRunner .

Spring boot предоставляет интерфейс CommanLineRunner с методом обратного вызова run (), который может быть вызван при запуске приложения после создания контекста приложения Spring.

Компоненты CommandLineRunner могут быть определены в одном и том же контексте приложения и могут быть упорядочены с использованием интерфейса @Ordered или @Order аннотаций.

@Component
public class CommandLineAppStartupRunnerSample implements CommandLineRunner {
    private static final Logger LOG =
      LoggerFactory.getLogger(CommandLineAppStartupRunnerSample .class);

    @Override
    public void run(String...args) throws Exception {
        LOG.info("Run method is executed");
        //Do something here
    }
}

Ответ с сайта: https://www.baeldung.com/running-setup-logic-on-startup-in-spring

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