不同war的ServletContextListener执行顺序

ServletContextListener execution order for different wars

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

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

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

当所有 WAR 都捆绑在 EAR 中时,可以管理应用程序的启动。它可以通过在 application.xmkl.

中添加 <initialize-in-order>true</initialize-in-order> 来完成

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

参考文献:

  • Tomcat Startup ordering

如果您想定义应用程序的 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>