Tomcat 没有在 Eclipse 中关闭
Posted
技术标签:
【中文标题】Tomcat 没有在 Eclipse 中关闭【英文标题】:Tomcat not shutting down within Eclipse 【发布时间】:2011-01-01 04:20:41 【问题描述】:我正在构建一个相对简单的网络应用程序,其中主 servlet 实现 ServletContextListener
接口以确定上下文是否已启动或停止。我已经实现了我的contextInitialized
、contextDestroyed
、init
和destroy
方法(init
和destroy
在基类上调用super
)。除了在加载log4j.properties
文件的contextInitialized
方法中初始化log4j 之外,我目前没有实现任何真正的功能。
然而,当我从 Eclipse 中启动和停止 Tomcat 服务器时,一切都以正确的顺序调用(我正在使用一些 System.out.println
来测试它)但是在停止服务器大约 10 秒后,我显示一个 Eclipse 弹出窗口,说明以下内容:
Server Tomcat v6.0 Server at localhost 没有响应。你想要_____吗 终止此服务器?点击确定 终止服务器或单击取消 继续等待。
这是我停止服务器时在我的 Eclipse 控制台中打印的内容:
2010 年 4 月 1 日下午 7:39:13 org.apache.catalina.core.StandardService 停止 信息:停止服务 Catalina contextDestroyed 04/01/2010 7:39:13 PM org.apache.coyote.http11.Http11Protocol 销毁 信息:在 http-8080 上停止 Coyote HTTP/1.1
在最后一条INFO
消息之后,它会一直挂在那里,直到弹出窗口出现。如果我选择等待,请按取消,Eclipse 将无法使用,我必须从终端终止 Eclipse 进程。
任何有关如何解决此问题的意见将不胜感激。
更新:
问题是由我在init
方法中启动的非守护线程引起的(忘记提及了:)。该问题已通过使用 stop
方法显式停止线程来解决,即使该方法似乎已被弃用。
【问题讨论】:
我真的是第一个使用标签“servlet”的人吗?!?servlets
似乎是更常见的标签。 :)
我认为这不仅发生在 Eclipse 中,而且通常发生。据我记得这是 log4j 资源的问题,谷歌考虑到这一点。
@Luke 我遇到了类似的问题,现在我想停止线程但无法理解如何获得线程参考。我看到的一个选项是我可以在 ServletContext 属性中设置线程对象,但我觉得这不是一个好习惯。你能解释一下你是怎么做的吗?我的意思是你是如何在 contextDestroyed 方法中获取线程引用来阻止它的。
@Vipin 抱歉延迟回复。是的,我保留对我的线程的引用。如果您不这样做,那么就像您提到的那样,将来无法引用它们。
【参考方案1】:
正如this thread 中提到的,这应该与清理问题有关。
如果 web 应用程序没有完全清理,尤其是在停止它启动的非守护线程方面,Tomcat 将无法关闭。 单击“停止”具有提供超时的优点。 如果 Tomcat 未能在超时时间内停止,则会出现一个对话框,让您可以选择终止服务器或继续等待。
【讨论】:
你的回答很成功。我在解释解决方案的问题中添加了更新。谢谢! 对我来说很好,即使发生超时并且我得到一个对话框,我单击强制 Tomcat 关闭,即使它没有关闭。所以我还在等待Tomcat服务器关闭。我知道我可以直接去杀死守护进程,但是强制关闭(在超时之后)也应该关闭服务器。【参考方案2】:在 Windows 中打开命令提示符或 PowerShell 并键入
netstat -nao
从结果中找到对应端口的pid并输入
taskkill /f /pid [port number]
【讨论】:
如何找到pid?【参考方案3】:我正在查看您的更新,这也解决了您的问题,对于这个问题的所有其他观众,我想提供更好的方法。
你应该在线程上调用中断并将运行方法的代码包装在 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");
【讨论】:
【参考方案4】:在 Windows 上,打开任务管理器并终止进程 javaw
。
【讨论】:
这对我的情况有所帮助。!【参考方案5】:例子:
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
【讨论】:
【参考方案6】:我也有类似的行为。如果关闭 Tomcat 无济于事,请尝试从控制台视图中找到另一个活动控制台并将其杀死。在我的情况下,它会有所帮助。
【讨论】:
不是我不能杀死/阻止它。我希望它能够正常关闭,而无需我通过头部射击它。【参考方案7】:在 Mac OS X 上,使用 Activity Monitor,强制退出 GrailsStarter 进程。
【讨论】:
以上是关于Tomcat 没有在 Eclipse 中关闭的主要内容,如果未能解决你的问题,请参考以下文章
像在eclipse中一样在intellij想法中关闭未使用的模块
如何在 Eclipse 中关闭 Javadoc 悬停(或有选择地启用它)?
如何在 Spring Boot 中关闭嵌入式 Tomcat?
linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池