Tomcat没有在Eclipse中关闭

我正在构建一个相对简单的Web应用程序,其中主servlet实现ServletContextListener接口以确定上下文是已启动还是已停止。 我已经实现了我的contextInitializedcontextDestroyedinitdestroy方法( initdestroy都在基类上调用super )。 我目前没有实现任何真正的function,除了我已经在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方法显式停止线程解决了该问题,即使该方法似乎已被弃用。

如本主题所述 ,这应该与清理问题有关。

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

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

 netstat -nao 

从结果和类型中找到相应端口的pid

 taskkill /f /pid [port number] 

例子:

 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 /pp@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

在Windows上,打开任务管理器并javaw进程javaw

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

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

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

而不是使用stop你应该调用线程上的中断并在while循环中包含run方法的代码来检查!isInterrupted(),每当调用中断时线程将退出循环并且run方法将完成其处理。 就像下面的例子我的另一个答案

 class Consumer implements Runnable{ private BlockingQueue blockingQueue; Consumer(BlockingQueue 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"); } } }