Tomcat 或 Java 中是不是存在诸如 beforeCrash() 或 beforeExit() 之类的函数
Posted
技术标签:
【中文标题】Tomcat 或 Java 中是不是存在诸如 beforeCrash() 或 beforeExit() 之类的函数【英文标题】:Does any function like beforeCrash() or beforeExit() exist in Tomcat or JavaTomcat 或 Java 中是否存在诸如 beforeCrash() 或 beforeExit() 之类的函数 【发布时间】:2018-01-09 10:04:12 【问题描述】:我正在运行 tomcat 服务器。并且由于某种原因突然崩溃...但是我正在尝试查找错误。
在 tomcat 或 java 中是否有像 beforeExit()
或 ifCrashed()
这样的函数,我可以在那里重写并编写一些代码,例如在服务器因某种原因崩溃时通知自己。
【问题讨论】:
您标记了 tomcat7 和 tomcat8。你真正使用的是哪一个? java也是一样。 实际上目前在tomcat7上,但如果该版本上存在tomcat8,我很快就会升级到。 在 java 中有 Thread.setUncaughtExceptionHandler,您可以在其中注册一个方法,以在出现意外异常时调用。我不知道这是否也适用于tomcat 如果 Tomcat 因Exception
或Error
而崩溃,您应该能够在日志中找到它。如果它由于一些原生错误而崩溃,您应该能够找到hs_err_pid.log
崩溃日志。 Oracle Java Troubleshooting Guide, Appendix C 指定在哪里可以找到崩溃日志。
【参考方案1】:
我不认为崩溃的服务器可以管理任何东西。您可以考虑以下步骤:
使用servletContextListeners
以便在servlet 上下文关闭之前运行代码。如果关机正常完成,它将起作用
如果是 JVM 崩溃,您可以尝试寻找提供 JVM 监控服务和报告的工具。另外我建议提供标志以便从OutOfMemoryError
获取报告并打开 JMX 端口进行监控
您可以纠正一些模拟休息端点并运行一些将定期调用该端点的外部作业,如果它返回 HTTPStatus.OK
则它可以工作,如果不是 - 那么您可以以某种方式报告自己。
如果您可以提供有关服务器实际情况的日志和一些信息,那就更好了。也许在这里人们会提供帮助,但我想这是另一个问题的主题。
【讨论】:
我已经在使用第三种方式了……但我讨厌投票这种东西【参考方案2】:如果发生致命崩溃,您将获得 jvm 日志。您可以通过在 Oracle JVM 上为 tomcat 提供 -XX:ErrorFile 来指定位置
http://www.oracle.com/technetwork/java/javase/felog-138657.html
如果不是那么致命,您可以调整 tomcat 中的日志设置以显示更好的日志记录级别,例如在他们的文档站点上指定的
https://tomcat.apache.org/tomcat-6.0-doc/logging.html
如果它因为内存不足错误而死,你可以在OOM上获得一个堆转储,并用jhat分析它
http://docs.oracle.com/javase/6/docs/technotes/tools/share/jhat.html
【讨论】:
【参考方案3】:您可以尝试使用在系统退出时执行的关闭挂钩。虽然不能保证它会在像 SIGKILL 这样的硬崩溃时执行,但在某些情况下这可能是一个选项:
Runtime.getRuntime().addShutdownHook(new Thread()
public void run()
// Implementation goes here..;
);
【讨论】:
【参考方案4】:如果您可以选择分析,JProfiler 有一个离线分析模式,您可以在其中捕获有关正在运行的程序的信息并将其记录下来以供以后查看。查看文档 JPRofiler Offline Profiling
这可能会让您更深入地了解应用程序中发生的事情。根据此文档,您还可以从您的应用程序管理分析代理。
【讨论】:
以上是关于Tomcat 或 Java 中是不是存在诸如 beforeCrash() 或 beforeExit() 之类的函数的主要内容,如果未能解决你的问题,请参考以下文章
解决javax.servlet.jsp.JspException cannot be resolved to a type
出现unable to open the service tomcat怎么办
有没有办法使用 rspec-serverspec 在部署期间测试是不是安装了特定版本的 java 或 tomcat?