【问题标题】:ServletContextListener execution order for different wars不同战争的ServletContextListener执行顺序
【发布时间】:2016-01-06 05:46:48
【问题描述】:

是否可以在不同的战争中控制 ServletContextListener 的执行顺序?

假设 Web 服务中有 3 个独立的模块 A、B 和 C。它们可以按任何顺序初始化,并且没有任何后果。但是,如果存在可选模块 D,则需要先对其进行初始化,并且可能会影响其他模块。这种配置可以通过 Spring 实现吗?唯一想到的是有一个全局 ServletContextListener 来轮询每个模块的 init 类是否存在于类路径中,但该解决方案似乎相当混乱。

【问题讨论】:

    标签: servlets war servletcontextlistener


    【解决方案1】:

    当所有 WAR 都捆绑在 EAR 中时,可以管理应用程序的启动。可以通过在application.xmkl 中添加<initialize-in-order>true</initialize-in-order> 来完成。

    如果所有的 WAR 都是独立的,那么就没有标准的方法可以做到这一点。但是,有一些特定于容器的功能可以让您做到这一点。

    参考资料:

    如果您想定义应用程序的 servlet 之间的依赖关系。 您可以定义Absolute ordering in web.xmlrelative ordering in web-fragment.xml

    绝对排序的工作原理如下:

    <web-app>
    ...
        <absolute-ordering>
          <name>A</name>
          <others/>
          <name>B</name>
        <absolute-ordering>
    </web-app> 
    

    如果 web.xml 中没有绝对顺序,容器会在 web-fragment.xml 中寻找相对顺序。它看起来像这样:

    <ordering>
        <before>
        <others />
        </before>
    </ordering>
    

    【讨论】:

    • 我没有时间对此进行深入研究,但我认为 web-fragment.xml 需要将所有模块添加到一些超级战争中。如果我错了,请纠正我。我试图完成的是部署 4 场独立的战​​争,这些战争彼此没有明确意识到。
    【解决方案2】:

    您可以在 web-fragment.xml 或 web.xml 中定义排序。请参阅以下链接以了解更多信息。 https://blogs.oracle.com/swchan/entry/servlet_3_0_web_fragment

    【讨论】:

      猜你喜欢
      • 2013-11-12
      • 2014-05-19
      • 1970-01-01
      • 1970-01-01
      • 2013-03-25
      • 1970-01-01
      • 1970-01-01
      • 2018-03-20
      • 2016-01-18
      相关资源
      最近更新 更多