如何在重启tomcat时控制webapp部署顺序

时间:2010-03-29 15:42:25

标签: deployment tomcat

我在一个tomcat 5.5容器中部署了许多war项目。他们通过http消费彼此的服务,因此我需要确保在重新启动Tomcat时,它们按特定顺序部署。 googlin'几个小时后,没有运气。

任何人都知道如何设置tomcat 5.5以特定顺序重启时部署战争?

提前致谢

5 个答案:

答案 0 :(得分:6)

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

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

  • 我找到的最简单的解决方案是按字母顺序命名我的webapps 他们要开始的顺序(或在开头添加一个额外的字母 如果你想让webapp名称合理地类似于webapp 你的生产webapps)。

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

  • 最后一个选择是使用您的启动脚本来部署您的 .war文件以适当的顺序(有足够的睡眠时间) 使它工作)。

答案 1 :(得分:3)

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

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

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

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

将部署3.WAR文件

以下是建议的解决方案:

如果要指定部署顺序,请在$ CATALINA_BASE / conf / [enginename] / [hostname] /MyApp.xml

中为Web应用程序定义上下文

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

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

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

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

如果您不关心破解一些tomcat代码并创建自己的Host实例,那么这很容易实现

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标记内以正确的顺序声明所有Web应用程序,它就可以解决问题:

<Host>
 <context app1>
 <context app2>

Thaen app1将在app2之前启动,无论你使用哪个。

答案 4 :(得分:-6)

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

您的应用程序彼此紧密耦合。

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

这只是在黑暗中拍摄而不太了解您的具体问题