завершение JVM, когда вкладка браузера закрыта в весенней загрузке приложения - PullRequest
0 голосов
/ 11 декабря 2018

У меня есть приложение spring-boot web для распространения в виде файла jar.Код для запуска приложения выглядит следующим образом:

private static ConfigurableApplicationContext ctx;

    public static void main(String[] args){

        if(ctx == null) {
            ctx = SpringApplication.run(MyApplication.class, args);
        }       
        try {
            openHomePage("http://localhost:8090/");
        }catch(Exception e) {
            logger.error("Error occured starting the application: ", e);
            ctx.close();
        }

    }


private static void openHomePage(String url) throws IOException, URISyntaxException {
        if(Desktop.isDesktopSupported()) {
            URI homePage = new URI(url);
            Desktop.getDesktop().browse(homePage);
        }else {
            Runtime runtime = Runtime.getRuntime();
            runtime.exec(new String[]{"cmd", "/c","start chrome " + url});
        }       

    }

, который открывает домашнюю страницу в Chrome, как при запуске из Eclipse, так и при двойном щелчке по файлу jar.

Проблема в том, что когда я запускаю приложение из файла jar и закрываю вкладку браузера, приложение продолжает работать в JVM, и мне приходится убивать его из task manager вручную, что раздражает,Если я не убью JVM и снова дважды не нажму на файл jar, приложение не запустится автоматически, как в первый раз, и мне придется вручную открыть новую вкладку браузера и набрать http://localhost:8090/ для использования приложения.

Можно ли убить каждый процесс после того, как пользователь закроет вкладку браузера, чтобы при следующем щелчке по файлу JAR в следующий раз, когда ему нужно было использовать приложение, появилась новая вкладка браузераоткрывается автоматически?

Заранее спасибо ..

Ответы [ 2 ]

0 голосов
/ 12 декабря 2018

РЕШЕНИЕ

Возможно, это не лучшее решение, но оно подойдет.

* Шаг 1. Отправка пульса из браузера

var heartBeatIntervals = null;

$( document ).ready(function() {

//this ajax call will be fired every 2 seconds as long as the browser tab stays open.
// the time intervals can of course be modified
heartBeatIntervals = setInterval(() => {
        $.ajax({
            type:'POST',
            url: 'http://localhost:8090/MyController/checkHeartbeats'
        })
    }, 2*1000);

});

* Шаг 2 - обработка пульса на сервере

@Controller
@RequestMapping("/MyController")
public class MyController {

    //declare an instance variable to store the number of missed heartbeats
    private int missedHeartbeats = 0;

    //reset the counter to 0 upon receiving the heartbeats
    @PostMapping("/checkHeartbeats")
    public void checkHeartbeats() {
        missedHeartbeats = 0;
    }

    //increase the missedHeartbeats by one every 3 seconds - or whatever
    @Scheduled(fixedRate = 3000)
    public void schedule() {
        missedHeartbeats++;
        //check how many heartbeats are missed and if it reaches to a certain value
        if(missedHeartbeats > 5) {
            //terminate the JVM (also terminates the servlet context in Eclipse)
            System.exit(0);
        }
    }

}

* Шаг - 3 Включение планирования

Чтобы использовать любое планирование в приложении spring-boot, необходимо добавить аннотацию @EnableScheduling в своем классе, где находится ваш метод main.

И все.

0 голосов
/ 12 декабря 2018

В Eclipse есть кнопка stop .А в случае, если это не может быть использовано:
Вы можете непрерывно отправлять что-то из javascript на ваш сервер, и когда сервер не получит его в течение 1 секунды, что означает, что веб-страница была закрыта, остановите себя.

Решение 1

  1. Используйте метод в любом @Controller для обработки запросов сердцебиения.
  2. Сохраните самое последнее время сердцебиения в поле static любого класса, начальное значение может быть 0 или -1, указывая, что веб-страница еще не открыта.
  3. Использование @Scheduled задача получить последнее время биения и сравнить с текущим временем.планировать задачу один раз в 2 секунды или что-то ещеhttps://docs.spring.io/spring/docs/3.2.x/spring-framework-reference/html/scheduling.html#scheduling-annotation-support
  4. Остановите JVM, если необходимо, возможно на System.exit(0).

Решение 2

Было бы проще, если бы вы добавили кнопку Закрыть на веб-странице.при нажатии он сигнализирует серверу об остановке, а затем закрывает саму веб-страницу.https://stackoverflow.com/a/18776480/9399618

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