Весной делаю при запуске сбои - PullRequest
3 голосов
/ 30 января 2020

Мне нужно выполнить некоторую работу, когда весеннее приложение готово, что-то похожее на @Scheduled, но я хочу, чтобы оно выполнялось только один раз. Я нашел несколько способов сделать это, например, использовать @PostConstruct на бобе, используя @EventListener или InitializingBean, однако все эти способы не соответствуют моим потребностям. Если во время выполнения этой логики c что-то пойдет не так, я хочу проигнорировать это, чтобы приложение все равно запускалось. Но при использовании этих методов приложение вылетает.

Конечно, я могу окружить логи c try-catch, и это будет работать. Но есть ли более элегантный способ?

Ответы [ 3 ]

5 голосов
/ 30 января 2020

Мы столкнулись с аналогичной проблемой с нашим microservices, чтобы запустить код сразу после запуска, мы добавили Component.

ApplicationStartup implements ApplicationListener<ApplicationReadyEvent>

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

@Component
public class ApplicationStartup implements ApplicationListener<ApplicationReadyEvent> {

    @Autowired
    YourService yourService;

    @Override
    public void onApplicationEvent(final ApplicationReadyEvent event) {

        System.out.println("ApplicationReadyEvent: application is up");
        try {
            // some code to call yourservice with property driven or constant inputs 
        } catch (Exception e) {
            e.printStackTrace();
        }
    }


} 
2 голосов
/ 30 января 2020

Когда вы используете @PostConstruct для реализации логики c, приложение еще не готово, поэтому оно как бы противоречит вашим требованиям. Spring инициализирует компоненты один за другим (с учетом зависимостей между ними.

В конце концов, он создает контекст приложения.

Когда контекст приложения полностью инициализирован, Spring действительно позволяет слушателям таким образом, слушатели - это способ go - когда вызывается слушатель, приложение готово.

В обоих случаях (PostConstruct, EventListener), если вы не используете блок try / catch контекст приложения потерпит неудачу, потому что он ждет, пока все слушатели будут выполнены.

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

Лично я не вижу проблем с try/catch подходом

1 голос
/ 30 января 2020

Вы можете использовать @PostConstruct (как вы сказали), но вы должны включить свой бизнес в try catch и игнорировать его, когда он вызывает исключение.

Пример кода

 @PostConstruct
 void init() {

    try {

      //Your business

    }

   catch (Exception e) {   

    //Do nothing Or you can just log          

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