代码之家  ›  专栏  ›  技术社区  ›  Luke

Tomcat没有在Eclipse中关闭

  •  15
  • Luke  · 技术社区  · 15 年前

    我正在构建一个相对简单的Web应用程序,其中主servlet实现 ServletContextListener 用于确定上下文是已启动还是已停止的接口。我已经实现了我的 contextInitialized ,请 contextDestroyed , init destroy 方法(两者) 初始化 破坏 呼叫 super 在基类上)。我目前没有实现任何真正的功能,除了在 ContextInitialized 方法在其中加载 log4j.properties 文件。

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

    本地主机上的服务器Tomcat V6.0服务器 没有响应。你想 终止此服务器?单击确定 终止服务器或单击“取消” 继续等待。

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

    2010年1月4日7:39:13 pm org.apache.catalina.core.standardservice stop
    信息:停止服务Catalina
    内容已销毁
    2010年1月4日下午7:39:13 org.apache.coyote.http11.http11协议销毁
    信息:在HTTP-8080上停止Coyote HTTP/1.1

    最后一次之后 INFO 消息它只是挂在那里直到弹出窗口出现。如果我选择等待,按取消,Eclipse将无法使用,我必须从终端终止Eclipse进程。

    对于如何解决这个问题的任何意见都将非常感谢。

    更新:

    问题是由一个非守护进程线程引起的,该线程是我在 初始化 方法(忘了说:)。通过使用 stop 方法,尽管该方法似乎已被弃用。

    7 回复  |  直到 7 年前
        1
  •  6
  •   VonC    15 年前

    如中所述 this thread ,这应该与清理问题相关。

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

        2
  •  6
  •   Sarath Sadasivan Pillai    11 年前

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

    netstat -nao
    

    找到 PID 结果和类型的对应端口

    taskkill /f /pid [port number] 
    
        3
  •  1
  •   Java_Fire_Within    9 年前

    实例:

    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
  •  1
  •   Noumenon    7 年前

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

        5
  •  0
  •   cetnar    15 年前

    我也有类似的行为。如果关闭Tomcat没有帮助,尝试从控制台视图中找到另一个活动的控制台并将其杀死。在我看来,这是有帮助的。

        6
  •  0
  •   hko19    11 年前

    在MacOSX上,使用活动监视器,强制退出GrailStarter进程。

        7
  •  0
  •   Vipin    8 年前

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

    而不是使用stop,u应该在线程上调用interrupt并将run方法的代码包装在 同时循环检查!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");
            }
        }
    }