Tomcat 没有在 Eclipse 中关闭

Posted

技术标签:

【中文标题】Tomcat 没有在 Eclipse 中关闭【英文标题】:Tomcat not shutting down within Eclipse 【发布时间】:2011-01-01 04:20:41 【问题描述】:

我正在构建一个相对简单的网络应用程序,其中主 servlet 实现 ServletContextListener 接口以确定上下文是否已启动或停止。我已经实现了我的contextInitializedcontextDestroyedinitdestroy 方法(initdestroy 在基类上调用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,强制退出 GrailsS​​tarter 进程。

【讨论】:

以上是关于Tomcat 没有在 Eclipse 中关闭的主要内容,如果未能解决你的问题,请参考以下文章

像在eclipse中一样在intellij想法中关闭未使用的模块

如何在 Eclipse 中关闭 Javadoc 悬停(或有选择地启用它)?

如何在 Spring Boot 中关闭嵌入式 Tomcat?

linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池

linux环境中关闭tomcat,通过shutdown.sh无法彻底关闭--线程池

eclipse中关闭java文件后再打开,找不到如何切换可视化编辑器