Java Tomcat没有在Eclipse中关闭

Java Tomcat没有在Eclipse中关闭,java,eclipse,tomcat,servlets,Java,Eclipse,Tomcat,Servlets,我正在构建一个相对简单的web应用程序,其中主servlet实现ServletContextListener接口,以确定上下文是否已启动或停止。我已经实现了contextInitialized、contextdestromed、init和destroy方法(都是init和destroy在基类上调用super)。除了在加载log4j.properties文件的contextInitialized方法中初始化log4j之外,我目前没有实现任何真正的功能 但是,当我在Eclipse中启动和停止Tomc

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

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

本地主机上的服务器Tomcat v6.0服务器 他没有反应。你想去吗 终止此服务器?单击“确定”以查看 终止服务器或单击“取消” 继续等待

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

2010年1月4日下午7:39:13 org.apache.catalina.core.StandardService站点
信息:停止Catalina服务
上下文已销毁
04/01/2010 7:39:13 PM org.apache.coyote.http11.http11协议销毁
信息:在HTTP-8080上停止郊狼HTTP/1.1

在最后一条
INFO
消息之后,它会一直挂在那里,直到弹出窗口出现。如果我选择等待,按Cancel,Eclipse将不可用,我必须从终端终止Eclipse进程

如果您对如何解决这个问题有任何意见,我们将不胜感激

更新:

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

如中所述,这应该与清理问题有关

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


我也有类似的行为。如果关闭Tomcat没有帮助,请尝试从console视图中找到另一个活动的控制台并将其杀死。在我的情况下,它会有所帮助。

在Windows上,打开任务管理器并在Mac OS X上终止进程
javaw

,使用活动监视器,强制退出GrailsStarter进程。

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

netstat -nao
从结果和类型中查找相应端口的pid

taskkill /f /pid [port number] 

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

应该在线程上调用中断,并将run方法的代码包装到 while循环检查哪一个!isInterrupted(),每当调用中断时,线程将从循环中出来,run方法将完成其处理。就像下面我的另一个例子

类使用者实现可运行{
私有阻塞队列阻塞队列;
消费者(封锁队列封锁队列){
this.blockingQueue=blockingQueue;
}
@凌驾
公开募捐{
而(!Thread.interrupted()){
系统输出打印(“启动震荡”);
试一试{
Message=blockingQueue.take();
系统输出打印(“消息Id”+消息.messageId+“已消费”);
}
捕捉(中断异常e){
e、 printStackTrace();
}
System.out.println(“震荡完成”);
}
}
}
示例:

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 * 
请使用此链接

我真的是第一个使用标签“servlet”的人吗
servlets
似乎是更常见的标记。:)我认为这不仅发生在eclipse中,而且在一般情况下也会发生。据我回忆,这是log4j资源的一个问题,google也有这个问题。@Luke我面临着类似的问题,现在我想停止线程,但无法理解如何获取线程引用。我看到的一个选项是我可以在ServletContext属性中设置thread对象,但我觉得这不是一个好的做法。你能解释一下你是怎么做的吗?我的意思是你是如何在contextDestroyed方法中获得线程引用来停止它的。@Vipin很抱歉延迟了响应。是的,我保留对我的线程的引用。如果你不这样做,那么就像你提到的那样,将来就没有办法引用它们了。这并不是说我不能杀死/阻止它。我希望它能正常关机,而不让我打爆它的头部。你的回答是“砰”的一声。我在问题中添加了一个更新来解释解决方案。谢谢对我来说,即使在超时发生时,我得到了一个对话框,我点击了强制Tomcat关闭,即使它没有关闭。所以我仍然在等待Tomcat服务器关闭。我知道我可以直接去杀死执事,但是强制关机(在超时后)也应该关闭服务器。如何找到pid?这对我的情况很有帮助。!
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 *