【问题标题】:Right way for handling a java web application startup error处理 java web 应用程序启动错误的正确方法
【发布时间】:2011-01-22 11:14:09
【问题描述】:

我目前正在编写一个在启动时执行特定检查的 Java Web 应用程序。例如,检查配置文件是否存在并定义了所有必需的设置变量。

我将检查代码放在ServletContextListener 类的子类中,并使用以下方法在 web.xml 中注册了 ServletContextListener 子类:

<listener>
    <listener-class>com.bloxware.lls3.MainContextListener</listener-class>
</listener>

在重写的 contextInitialized() 方法中,我编写了检查配置文件是否到位并包含有效值的代码。

如果启动时发生错误,我想记录此错误并以适当的方式通知网络用户。

我需要帮助如何从这里继续前进

  1. 我是否在正确的位置(在 ServletContextListener.contextInitialized(..) 方法内)读取配置文件参数?

  2. 1234563可能是 ServletRequestListener.requestInitialized(..))?
  3. 我需要一种方法,如果用户修复了配置文件,刷新页面就足够了,不需要重新启动 Web 应用程序。

【问题讨论】:

    标签: java servlets error-handling war


    【解决方案1】:

    我可以尊重具有自我检查的动态配置的目标,但实际上我不建议走这条路。

    在大多数情况下(稍后需要注意),当 Web 应用程序启动时,它要么配置正确,要么配置不正确。如果应用程序配置错误,它根本无法工作。例如,当应用程序启动时,许多应用程序将连接到数据库。如果他们的连接字符串错误,则永远不会有良好的用户体验。这应该在启动时处理,并且。 Web 应用程序不应该启动,如果它知道它不能运行。在您的整个应用程序中散布代码来处理这不是要走的路。

    在上下文初始化时检查这个的想法很好。但是,它应该非常愿意当场抛出详细的记录异常,以便管理员(而不是用户!)可以处理问题并重新启动应用程序。

    关于无需重启即可更新的动态配置。这适用于调整非关键参数,例如超时长度、日志记录级别或池设置。这些应该只是在不正确的情况下不会使应用程序立即停止的事情。您的数据库连接的主机名(例如)不是其中之一。

    根据我的经验,这些事情都不值得为处理动态重新加载配置引起的所有附带问题付出努力。如果出现致命问题,我会在启动时检查并立即停止。

    编辑:旁注 - 检查您的配置文件是否到位并包含所有必要的设置可能应该在测试中完成,而不是在应用程序启动时完成。您可以对文件本身进行简单的单元测试。

    【讨论】:

    • 如果管理员更改了配置文件并错误输入了数据库密码、数据库用户名或其他配置参数,会发生什么情况。如果发生这种情况,我不希望 Web 应用程序允许访问其 jsp 页面和 servlet,而是希望它至少转发到一个错误页面,上面写着“发生错误,请咨询管理员”。此时可以联系到管理员,他可以很方便的快速查看日志文件。
    • 您说:“Web 应用程序不应该启动,如果它知道它无法运行。”。问题:应用程序如何无法启动。我应该使用什么方法使其无法启动,这意味着 servvet 和 JSP 变得不再可访问。目前,抛出一个错误,但页面是可访问的,我不喜欢这种行为。
    • “检查您的配置文件是否到位并包含所有必要的设置可能应该在测试中完成,而不是在应用程序启动时完成。” --> 构建产品时,配置文件是用户输入的一部分,应该进行验证。如果管理员在配置文件中输入了错误的值,它应该会正常失败并在用户界面上显示一个指示。我不能依赖单元测试。
    • “在整个应用程序中散布代码来处理这个问题是不可行的。” -> 响应:可以使用过滤器检查应用程序的全局状态,所有代码都在一个地方,无需在所有 servlet 和 JSP 之间散布代码。
    • #1 不应随意更改应用配置。如果管理员搞砸了,希望测试能在投入生产之前告诉他们。即使没有,应用程序启动和监控也应该通知他们,而不是最终用户。如果它在管理员之前到达最终用户,则有问题。 #2 如果在初始化期间抛出 servlet 异常,Web 应用程序将无法启动。它会停在它的轨道上。这就是您知道配置错误的方式。这比向用户公开要好。
    猜你喜欢
    • 1970-01-01
    • 2020-05-13
    • 2011-09-17
    • 1970-01-01
    • 2013-09-27
    • 2014-02-16
    • 2010-10-19
    • 2012-10-30
    • 1970-01-01
    相关资源
    最近更新 更多