Tomcat没有在Eclipse中关闭

时间:2010-01-04 08:46:48

标签: java eclipse tomcat servlets

我正在构建一个相对简单的Web应用程序,其中主servlet实现ServletContextListener接口以确定上下文是已启动还是已停止。我已经实施了我的contextInitializedcontextDestroyedinitdestroy方法(initdestroy调用super基类)。我目前没有实现任何真正的功能,除了我在contextInitialized方法中初始化log4j,我加载了log4j.properties文件。

当我从Eclipse中启动和停止Tomcat服务器时,所有内容都以正确的顺序调用(我使用一些System.out.println来测试这个)但是在停止服务器大约10秒后我我看到了一个Eclipse弹出窗口,说明了以下内容:

  

localhost上的服务器Tomcat v6.0服务器   没有回应。你想要_____吗   终止这个服务器?单击“确定”   终止服务器或单击取消   继续等待。

这是我停止服务器时在Eclipse控制台中打印的内容:

  

04/01/2010 7:39:13 PM org.apache.catalina.core.StandardService stop
  信息:停止服务Catalina
  contextDestroyed
  04/01/2010 7:39:13 PM org.apache.coyote.http11.Http11Protocol destroy
  信息:在http-8080上停止Coyote HTTP / 1.1

在最后一条INFO消息之后,它会挂起,直到出现弹出窗口。如果我选择等待,请按取消,Eclipse变得无法使用,我必须从终端终止Eclipse进程。

非常感谢有关如何解决此问题的任何意见。

更新

问题是由我在init方法中启动的非守护程序线程引起的(忘了提及:)。通过使用stop方法显式停止线程解决了这个问题,即使该方法似乎已被弃用。

7 个答案:

答案 0 :(得分:6)

this thread中所述,这应该与清理问题有关。

  

如果webapp没有完全清理,特别是在停止启动非守护程序线程时,Tomcat将无法关闭。
  单击“停止”具有提供超时的优势   如果Tomcat未能在超时内停止,则会出现一个对话框,提供终止服务器或继续等待的选项。

答案 1 :(得分:6)

在Windows中打开命令提示符或PowerShell并键入

netstat -nao

从结果中找到相应端口的 pid 并输入

taskkill /f /pid [port number] 

答案 2 :(得分:1)

在Windows上,打开任务管理器并终止进程{​​{1}}。

答案 3 :(得分:1)

示例:

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 p@ssW23 /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 :(得分:0)

我有类似的行为。如果关闭Tomcat无法帮助尝试从控制台视图中找到另一个活动控制台并将其终止。就我而言,它有所帮助。

答案 5 :(得分:0)

在Mac OS X上,使用Activity Monitor,强制退出GrailsS​​tarter进程。

答案 6 :(得分:0)

我正在查看您的更新,这也解决了您的问题,对于此问题的所有其他观众,我想提供更好的方法。

而不是使用stop u应该在线程上调用interrupt并将run方法的代码包装在其中  while循环检查!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");
        }
    }
}