某些jsp页面的间歇性Tomcat ClassNotFoundException
Posted
技术标签:
【中文标题】某些jsp页面的间歇性Tomcat ClassNotFoundException【英文标题】:Intermittent Tomcat ClassNotFoundException for some jsp pages 【发布时间】:2011-04-28 21:09:04 【问题描述】:我们在 apache 后面有两个负载均衡的 tomcat 服务器。现在我们多次收到关于页面上 500 错误的报告。检查显示以下错误,但仅在其中一个 tomcat 上:
java.lang.ClassNotFoundException: org.apache.jsp.jsps.userLogin_jsp
at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
at java.security.AccessController.doPrivileged(Native Method)
etc...
我尝试清除工作目录并编辑 jsp 页面,但没有成功。解决它的唯一方法是重启 tomcat,但显然我们需要在生产中避免这种解决方案。
以前有人解决过这个问题吗?我的搜索只找到了没有答案的问题,包括一个被解决为“对我有用”的 tomcat 错误:https://issues.apache.org/bugzilla/show_bug.cgi?id=30450
非常感谢您的任何见解。以下是有关该项目的其他一些信息:
apache-tomcat-6.0.28 java 1.6 行家 Spring 2.5(大量使用带有 jstl 的 MVC)谢谢!
【问题讨论】:
如果它始终是同一个 Tomcat,即使只有该服务器在集群中,即另一台关闭,它是否也会失败。我想您无法在 Prod 上进行测试,您是否有要复制的预生产实例?是否总是相同的 userLogin.jsp 或其他 JSP? 也可以看到这个线程,issues.apache.org/bugzilla/show_bug.cgi?id=48097,虽然这会进入 6.0.21。你在运行 JspServlet development = true 感谢您提供的信息链接!不幸的是,这不是我能够重现的东西。一开始忘记了,昨天又推了一个新的战争,忘记清空工作目录才重新启动tomcat。我在tomcat启动后继续做。您认为这可能是造成这种情况的原因吗? 在 Tomcat 运行时清除工作目录对于生产中的服务器来说不是一个好主意。 之前是否有其他异常记录?这可能是其他事情的结果,例如内存不足。它可能由于某种原因无法生成 servlet 类文件。 【参考方案1】:我发现了另一个实例,它可能会导致类似的情况。我在 tomcat 中部署了两个应用程序,当我部署第三个应用程序时,我开始观察到这一点 行为。
在这种特殊情况下,我发现带有这三个应用程序的 tomcat 会打开很多文件,在这种情况下,有时需要打开大约 1600 个文件才能工作(系统库、jar、临时文件等)。当它在某些请求中超过系统默认 1024 max opens files 时,看起来有些文件无法打开并且我随机出现奇怪的错误 (包括jsp-s中经常出现的ClassNotFoundException)。这一切都取决于我在浏览器窗口中单击这些应用程序的速度,文件打开和关闭的速度。
这对我有帮助,我不再看到这个实例有问题:
ulimit -n 2048
这可能用于在服务器运行时观察,打开文件的数量是多少(如果tomcat以“tomcat”用户身份运行):
while [ true ]; do lsof -u tomcat|wc -l; sleep 1s; done
【讨论】:
过去我们不得不增加 ulimit 以解决我们遇到的其他一些问题(日志中的“打开的文件太多”)。我认为 ulimit 设置是每个人都应该知道的,但我们大多数人都很难找到!【参考方案2】:如上面的 cmets 所述,我不应该在 Tomcat 运行时清除它的工作目录。谢谢大家!
【讨论】:
以上是关于某些jsp页面的间歇性Tomcat ClassNotFoundException的主要内容,如果未能解决你的问题,请参考以下文章
使用 eclipse 的 JSP 的间歇性 ClassNotFoundException
Tomcat正常启动,可以访问tomcat主页,却不能访问webapp中的项目的jsp文件,这是啥原因?
web.xml - Java Servlet 过滤器 - 在处理 JSP 页面之前未运行(在 Tomcat 上)