ApplicationRestarter.java 1.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546
  1. package com.provectus.kafka.ui.util;
  2. import com.provectus.kafka.ui.KafkaUiApplication;
  3. import java.io.Closeable;
  4. import lombok.extern.slf4j.Slf4j;
  5. import org.springframework.boot.context.event.ApplicationStartedEvent;
  6. import org.springframework.context.ApplicationContext;
  7. import org.springframework.context.ApplicationListener;
  8. import org.springframework.stereotype.Component;
  9. @Slf4j
  10. @Component
  11. public class ApplicationRestarter implements ApplicationListener<ApplicationStartedEvent> {
  12. private String[] applicationArgs;
  13. private ApplicationContext applicationContext;
  14. @Override
  15. public void onApplicationEvent(ApplicationStartedEvent event) {
  16. this.applicationArgs = event.getArgs();
  17. this.applicationContext = event.getApplicationContext();
  18. }
  19. public void requestRestart() {
  20. log.info("Restarting application");
  21. Thread thread = new Thread(() -> {
  22. closeApplicationContext(applicationContext);
  23. KafkaUiApplication.startApplication(applicationArgs);
  24. });
  25. thread.setName("restartedMain-" + System.currentTimeMillis());
  26. thread.setDaemon(false);
  27. thread.start();
  28. }
  29. private void closeApplicationContext(ApplicationContext context) {
  30. while (context instanceof Closeable) {
  31. try {
  32. ((Closeable) context).close();
  33. } catch (Exception e) {
  34. log.warn("Error stopping application before restart", e);
  35. throw new RuntimeException(e);
  36. }
  37. context = context.getParent();
  38. }
  39. }
  40. }