Deployment 重新启动tomcat时如何控制webapp部署顺序

Deployment 重新启动tomcat时如何控制webapp部署顺序,deployment,tomcat,Deployment,Tomcat,我在一个Tomcat5.5容器中部署了许多war项目。它们通过http使用彼此的服务,因此我需要确保,当Tomcat重新启动时,它们是按特定顺序部署的。闲逛了几个小时,运气不好 有人知道如何设置tomcat 5.5,以便在重新启动时按特定顺序部署WAR吗 提前感谢坦率地说,您需要重新审视您的体系结构 您的应用程序之间的耦合过于紧密 您可能应该有一些控制器应用程序,并让所有应用程序注册到它或类似的东西 这只是一个不太了解您的具体问题的暗中操作将您的应用程序重新构造为一个核心插件。将核心代码放入sh

我在一个Tomcat5.5容器中部署了许多war项目。它们通过http使用彼此的服务,因此我需要确保,当Tomcat重新启动时,它们是按特定顺序部署的。闲逛了几个小时,运气不好

有人知道如何设置tomcat 5.5,以便在重新启动时按特定顺序部署WAR吗


提前感谢

坦率地说,您需要重新审视您的体系结构

您的应用程序之间的耦合过于紧密

您可能应该有一些控制器应用程序,并让所有应用程序注册到它或类似的东西


这只是一个不太了解您的具体问题的暗中操作

将您的应用程序重新构造为一个核心插件。将核心代码放入shared/lib文件夹中,webapps就可以从那里访问它。

不要听“坦率地说”和“重新构造”,它们显然是在完全控制的环境中工作的。我在一个大规模分布式系统上工作,我们的web应用程序分散在数百台机器上,其中一些web应用程序来自其他供应商,因此我无法“重新构建”

为了启动许多服务,它们需要与其他服务对话以获取配置信息。如果该服务不存在,则新服务无法启动。在生产环境中,有些东西永远不会停止(负载平衡、HA等),但当我需要在笔记本电脑上设置开发环境时,我遇到了这个问题

  • 我找到的最简单的解决办法是按字母顺序给我的网络应用命名 开始的顺序(或在开始处添加一个额外的字母) 如果您希望webapp名称合理类似于 您的生产网络应用程序)

  • 您还可以使用多个Tomcat安装(组织您的Web应用程序) 并按正确的顺序启动Tomcat实例),但这是一个错误 很多开销

  • 最后一个选项是使用启动脚本部署 .war文件的正确顺序(在 在两者之间(以使其工作)


如果你不介意破解一点tomcat代码并创建自己的主机实例,那么这很容易实现

1) 创建org.apache.catalina.core.StandardHost的子类,例如MyHost:

class MyHost extends org.apache.catalina.core.StandardHost{
    public MyHost (){
    super();
    //changing HashMap for a predictable ordered Map :)
    this.children = new LinkedHashMap();
    }
} 
2) 在服务器的xml主机标记()上注册类

尽管看起来不可思议,但只要您在主机标签中以正确的顺序声明所有web应用,它就能解决问题:

<Host>
 <context app1>
 <context app2>


不管您使用的是哪种方式,THEAN app1都将在app2之前启动。

tomcat确实没有提供任何强制执行部署顺序的方法

Tomcat按以下顺序部署Web应用程序:

1.将首先部署任何上下文描述符

2.然后将部署未被任何上下文描述符引用的分解web应用程序。如果appBase中有一个关联的.WAR文件,并且该文件比分解后的web应用程序更新,则分解后的目录将被删除,web应用程序将从.WAR中重新部署

3.WAR文件将被部署

File file = new File("/opt/tomcat/conf/Catalina/localhost");
        File[] files = file.listFiles();
        for (File f : files)
        {
            System.out.println("Filename: " + f.getName());
        }
这里有一个建议的解决方案:

如果要指定部署顺序,请在$CATALINA_BASE/conf/[enginename]/[hostname]/MyApp.xml中定义web应用程序的上下文

Tomcat通过执行File listFiles()扫描$CATALINA_BASE/conf/[engineame]/[hostname]/,该文件返回一个按哈希值排序的文件数组(取决于操作系统)

您可以使用以下代码检查webapps的部署顺序

File file = new File("/opt/tomcat/conf/Catalina/localhost");
        File[] files = file.listFiles();
        for (File f : files)
        {
            System.out.println("Filename: " + f.getName());
        }

恰当地命名部署描述符将解决您的问题。

而且一切都很好,直到启动的时间比您预期的要长,或者添加了您没有预料到的内容(或者您移植到一个以不同顺序列出文件的操作系统;我听说,不保证按字母顺序排列!)。然后,比赛条件和错误比比皆是。也许你很乐意处理这件事,但我不会。修复应用程序比像这样用胶带粘好要好。同意赵的观点——“坦率地说:”)这并不总是像重组那么简单。如果这个人(像我一样)有一个需要在项目代码之前部署的模拟服务器呢?请回答有关如何控制部署顺序的问题。没有回答问题。你是对的-没有。所以,如果这是一个反对票-对的。也就是说,我想说的是,如果你有一个体系结构,它取决于应用程序必须出现的特定顺序,那么它就是一种气味。不知道那是什么意思,但这是不对的。我相信你能找到解决这个问题的办法。我只是指出你在追求一个错误的问题。再一次,我同意我没有回答这个问题。除了询问者的场景中有人想要一个特定的部署顺序之外,还有很多原因。例如,我希望我的war A在B之前部署,因为A负责运行模式升级任务。如果B先运行,那么B完全无法部署。根本不回答这个问题。我通过重命名.war文件处理了相同的问题。