Tomcat没有在Eclipse中关闭
我正在构建一个相对简单的Web应用程序,其中主servlet实现ServletContextListener
接口以确定上下文是已启动还是已停止。 我已经实现了我的contextInitialized
, contextDestroyed
, init
和destroy
方法( init
和destroy
都在基类上调用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,强制退出GrailsStarter进程。
我正在查看你的更新,这也解决了你的问题,对于这个问题的所有其他观众,我想提供更好的方法。
而不是使用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"); } } }