【问题标题】:How to control webapp deployment order when restarting tomcat重启tomcat时如何控制webapp部署顺序
【发布时间】:2010-03-29 15:42:25
【问题描述】:

我在单个 tomcat 5.5 容器中部署了许多战争项目。它们通过 http 使用彼此的服务,因此我需要确保在重新启动 Tomcat 时,它们以特定的顺序部署。在谷歌搜索了几个小时后,没有运气。

有人知道如何设置 tomcat 5.5 以在重启时按特定顺序部署战争吗?

提前致谢

【问题讨论】:

    标签: deployment tomcat


    【解决方案1】:

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

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

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

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

    • 最后一个选择是使用您的启动脚本来部署您的 .war 文件以适当的顺序(在 之间以使其工作)。

    【讨论】:

    • 一切都很好,直到某些事情的启动时间比您预期的要长,或者添加了您没有预料到的内容(或者您移植到以不同顺序列出文件的操作系统;最后我听说,不保证字母顺序!)。然后竞争条件和错误比比皆是。也许你很高兴处理这个问题,但我不会。最好修复应用程序而不是像这样用胶带粘住它。期间。
    • 同意 cHao - “坦率地说”:)
    【解决方案2】:

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

    Tomcat 按以下顺序部署 webapp:

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

    2. 任何上下文描述符未引用的已爆炸 Web 应用程序随后将被部署。如果他们在 appBase 中有关联的 .WAR 文件并且它比展开的 Web 应用程序更新,则展开的目录将被删除,并且 Web 应用程序将从 .WAR 中重新部署

    3.WAR文件将被部署

    这是一个建议的解决方案:

    如果您想指定部署顺序,请在 $CATALINA_BASE/conf/[enginename]/[hostname]/MyApp.xml 中为您的 Web 应用程序定义一个上下文

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

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

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

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

    【讨论】:

      【解决方案3】:

      将您的应用重新构建为核心加插件。将核心代码放入 shared/lib 文件夹,webapps 可以从那里访问它。

      【讨论】:

        【解决方案4】:

        如果您不关心 hack 一些 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 Host 标签上注册你的类()

        虽然看起来不可思议,但只要您在 Host 标签内以正确的顺序声明了所有 Web 应用程序,它就可以解决问题:

        <Host>
         <context app1>
         <context app2>
        

        Thaen app1 将在 app2 之前启动,无论您使用哪种 SO。

        【讨论】:

          【解决方案5】:

          坦率地说,您需要重新审视您的架构。

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

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

          这只是在不了解您的具体问题的情况下在黑暗中拍摄

          【讨论】:

          • 这并不总是像重组那么简单。如果这个人(像我一样)有一个需要在项目代码之前部署的模拟服务器怎么办?请回答关于如何控制部署顺序的问题。
          • 不回答问题。
          • 你是对的——它没有。因此,如果它对此投反对票,那就对了。就是说——我想说的是——如果你的架构依赖于应用程序必须出现的特定顺序——它是一种气味。不知道那是什么意思——但这是不对的。我相信您可以找到解决所发布问题的方法。我只是指出你在追查错误的问题。,再一次 - 同意我没有回答这个问题。
          • 除了提问者想要特定部署顺序的场景之外,还有很多原因。例如,我希望我的战争 A 在 B 之前部署,因为 A 是负责运行模式升级任务的人。如果 B 先运行,则 B 完全部署失败。
          • 根本不回答这个问题。我通过重命名 .war 文件解决了同样的问题。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-07-18
          • 1970-01-01
          • 2012-06-08
          • 1970-01-01
          相关资源
          最近更新 更多