我正在构建一个相对简单的Web应用程序,其中主servlet实现ServletContextListener
接口以确定上下文是已启动还是已停止。我已经实施了我的contextInitialized
,contextDestroyed
,init
和destroy
方法(init
和destroy
调用super
基类)。我目前没有实现任何真正的功能,除了我在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
方法显式停止线程解决了这个问题,即使该方法似乎已被弃用。
答案 0 :(得分:6)
如this thread中所述,这应该与清理问题有关。
如果webapp没有完全清理,特别是在停止启动非守护程序线程时,Tomcat将无法关闭。
单击“停止”具有提供超时的优势 如果Tomcat未能在超时内停止,则会出现一个对话框,提供终止服务器或继续等待的选项。
答案 1 :(得分:6)
在Windows中打开命令提示符或PowerShell并键入
netstat -nao
从结果中找到相应端口的 pid 并输入
taskkill /f /pid [port number]
答案 2 :(得分:1)
在Windows上,打开任务管理器并终止进程{{1}}。
答案 3 :(得分:1)
示例:
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
答案 4 :(得分:0)
我有类似的行为。如果关闭Tomcat无法帮助尝试从控制台视图中找到另一个活动控制台并将其终止。就我而言,它有所帮助。
答案 5 :(得分:0)
在Mac OS X上,使用Activity Monitor,强制退出GrailsStarter进程。
答案 6 :(得分:0)
我正在查看您的更新,这也解决了您的问题,对于此问题的所有其他观众,我想提供更好的方法。
而不是使用stop u应该在线程上调用interrupt并将run方法的代码包装在其中 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");
}
}
}