【发布时间】: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 抱歉延迟回复。是的,我保留对我的线程的引用。如果您不这样做,那么就像您提到的那样,将来无法引用它们。
标签: java eclipse tomcat servlets