Tomcat не закрывается в Eclipse

Я создаю относительно простое веб-приложение, где главный сервлет реализует интерфейс ServletContextListener, чтобы определить, был ли запущен или остановлен контекст. Я применил методы contextInitialized, contextDestroyed, init и destroy (оба init и destroy вызов super в базовом классе). В настоящее время я не реализовал никаких реальных функций, кроме того, что я инициализировал log4j в методе contextInitialized, где я загружаю файл log4j.properties.

Когда я запускаю и останавливаю сервер Tomcat из Eclipse, все вызывается в правильном порядке (я тестирую это System.out.println), но примерно через 10 секунд после остановки сервера я получаю всплывающее окно Eclipse, в котором указано следующее:

Сервер Tomcat v6.0 Сервер на локальном хосте не отвечает. хотите ли вы завершить этот сервер? Нажмите OK, чтобы завершите работу сервера или нажмите Отмена для продолжения ожидания.

Это то, что было напечатано на моей консоли Eclipse при остановке сервера:

04/01/2010 7:39:13 вечера org.apache.catalina.core.StandardService stop
INFO: Остановка обслуживания Catalina
contextDestroyed
04/01/2010 7:39:13 вечера org.apache.coyote.http11.Http11Protocol destroy
INFO: остановка Coyote HTTP/1.1 на http-8080

И после последнего сообщения INFO он просто зависает там, пока не появится всплывающее окно. Если я решила подождать, нажмите "Отмена", "Eclipse" станет непригодным и мне придется убить процесс Eclipse с терминала.

Приветствуется любой вклад в решении этой проблемы.

UPDATE:

Проблема была вызвана потоком не-демона, который я начинаю с моего метода init (забыл упомянуть об этом:). Проблема была решена путем явной остановки потока с помощью метода stop, хотя этот метод кажется устаревшим.

Ответы

Ответ 1

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

Если webapp полностью не очищается, особенно в отношении остановки потоков не-daemon, Tomcat не завершит работу.
Нажатие "Стоп" имеет преимущество в предоставлении тайм-аута.
Если Tomcat не сможет остановиться в течение таймаута, появится диалоговое окно, дающее вам возможность прекратить работу сервера или продолжить ожидание.

Ответ 2

Откройте командную строку или PowerShell в окнах и введите

netstat -nao

найдите pid соответствующего порта из результата и введите

taskkill /f /pid [port number] 

Ответ 3

Примеры:

taskkill /pid 1230 /pid 1241 /pid 1253 
taskkill /f /fi "USERNAME eq NT AUTHORITY\SYSTEM" /im notepad.exe 
taskkill /s srvmain /f /im notepad.exe 
taskkill /s srvmain /u maindom\hiropln /p [email protected] /fi "IMAGENAME eq note*" /im * 
taskkill /s srvmain /u maindom\hiropln /fi "USERNAME ne NT*" /im * 
taskkill /f /fi "PID ge 1000" /im * 

Пожалуйста, используйте эту ссылку https://technet.microsoft.com/en-us/library/bb491009.aspx

Ответ 4

У меня было подобное поведение. Если закрытие Tomcat не помогает найти другую активную консоль из консольного представления и убить ее. В моем случае это помогает.

Ответ 5

В Mac OS X используйте Activity Monitor, принудительно завершите процесс GrailsStarter.

Ответ 6

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

Вместо использования stop u следует вызывать прерывание в потоке и код обертывания метода run в  while loop, который проверяет! isInterrupted(), всякий раз, когда прерывание называется потоком, выйдет из цикла, и метод run завершит его обработку. Как приведенный ниже пример из моего другого answer

class Consumer implements Runnable{
    private BlockingQueue<Message> blockingQueue;
    Consumer(BlockingQueue<Message> blockingQueue){
        this.blockingQueue=blockingQueue;
    }

    @Override
    public void run(){
        while(!Thread.interrupted()){
            System.out.print("Concumer Started");
            try{
                Message message  = blockingQueue.take();
                System.out.print("message Id"+message.messageId+" Consumed ");
            }
            catch(InterruptedException e){
                e.printStackTrace();
            }
            System.out.println("Concumer Done");
        }
    }
}

Ответ 7

открыть диспетчер задач и убить процесс