【问题标题】:Skip deploying or stop web application if servlet context initialization fails如果 servlet 上下文初始化失败,则跳过部署或停止 Web 应用程序
【发布时间】:2023-04-05 16:05:01
【问题描述】:

在我们的项目中,我们有几个基于 Spring 的模块作为 Web 应用程序部署在 WAS 上。如果 Spring 上下文初始化失败(即ContextLoaderListener#contextInitializedDispatcherServlet#init 抛出异常),我们需要跳过部署或停止模块。现在,如果发生这种情况,应用程序会被部署并启动,但对于任何请求都会返回 HTTP 500。

Websphere 8.5.5

相关问题:https://stackoverflow.com/a/272747/3459206

【问题讨论】:

    标签: java servlets web-applications websphere


    【解决方案1】:

    这个 APAR 似乎是相关的:

    https://www-01.ibm.com/support/docview.wss?uid=swg1PI58875

    来自 APAR 文本:

    Listener exceptions typically should not stop the application
    from starting up for service. However, some applications depend
    on their listeners to do the necessary setup before the
    application is started for service. Such applications prefer to
    stop the application from starting up when there is any
    exception in their listeners.
    

    问题结论

    The WebContainer Container code was modified to provide an
    option to stop the application when there is any listener
    exception during the application starting up process.
    
    A new WebContainer custom property needs to be set to enable the
    behavior provided by this APAR:
    
    For Full Profiles
    
    com.ibm.ws.webcontainer.stopappstartuponlistenerexception = true
    (default is false)
    
    For Liberty Profile
    
    stopappstartuponlistenerexception=true
    
    The fix for this APAR is currently targeted for inclusion in
    WebSphere Application Server fix packs 8.5.5.11 and  9.0.0.2,
    and Liberty 16.0.0.3
    

    有关更多信息,请参阅 APAR 链接。

    【讨论】:

    • 请注意,此解决方案取决于您的管理员配置。如果他们错过了它,你就有了一个行为不端的应用程序。在管理团队高度分散的大型企业中,这可能是个问题。
    【解决方案2】:

    你可以使用 jenkins + maven。 添加您需要在测试下检查的部分,例如junit。 那么如果这个模块没有通过测试,jenkins 就不会部署它。

    但我更喜欢在部署之前修复错误

    【讨论】:

    • 这个问题与部署初始化依赖于我们在测试阶段无法访问的外部模块的情况有关。
    【解决方案3】:

    有一个非常相似的问题。 问题是 - webfear - 抱歉无法抗拒 ;-) 不会在启动时初始化所有内容。

    为了触发一个受控请求,我在应用程序的启动中添加了一个 ScheduledEJB。这个 bean 本身触发了一个对已定义 URL 的 http 请求,该 URL 本身触发了:

    • 要在链中初始化的任何过滤器
    • 初始化任何需要的上下文

    这本身确保了我的应用程序(EAR 或 WAR)在部署后得到非常快速的测试。这适用于每分钟少量的请求

    如果您在高负载下工作,这意味着每秒有大量请求,您需要选择不同的方法。 在这种情况下,我在应用程序的@Startup 中添加了一个轮询机制,它每秒或 250 毫秒轮询一次(取决于应用程序的负载)。 这种对服务器的触发确保了我的 @Startup bean 是第一个触发应用程序中可能的 init 问题的。如果发生这种情况,我会初始化一个过滤器,它总是向请求者报告 500(或更好的拟合错误)。

    当然要停止你的 bean,一旦你得到 500,否则你的管理员可能想杀了你。 (发生在我身上,因为我生产了大量或监控问题;-)) 当然,在常规操作中,在您的应用程序正常启动后,您还应该禁用轮询

    【讨论】:

    • 如果检测到未正确初始化应用程序如何停止? Websphere 有什么可行的解决方案吗?
    • @AlexSalauyou 你是如何为 websphere(EAR、WAR)打包应用程序的?需要检查我的确切解决方案,这已经是几年前的事了。同时,我更喜欢使用 Wildfly 之类的开源容器——当然,如果客户允许的话。
    • xml配置的Spring应用打包成war-s
    • 遗憾的是,您无法从应用程序的“内部”控制取消部署应用程序。每个容器都有不同的处理启动/停止的方式。你能解释一下为什么停止申请很重要吗?它是 Web 应用程序、Web 服务还是桌面应用程序的后端?
    【解决方案4】:

    在您的应用程序代码的顶层寻找一个 try-catch 来捕获 Spring 异常并允许应用程序继续运行。

    据我所知,如果允许抛出的 Spring 异常传播到堆栈顶部,则 JVM 将停止并且无法继续运行。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-28
      • 2021-07-13
      • 2012-12-20
      • 1970-01-01
      • 2018-02-25
      • 2020-04-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多