2010-03-29 126 views
2

我在单个tomcat 5.5容器中部署了多个war项目。它们通过http消耗对方的服务,因此我需要确保在Tomcat重新启动时,它们按特定顺序部署。经过几个小时googlin'周围,没有运气。如何在重新启动tomcat时控制webapp部署顺序

任何人都知道如何设置tomcat 5.5在特定的命令重新启动时部署战争?

在此先感谢

回答

-6

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

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

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

这仅仅是一个在黑暗中拍摄,而不

+0

它并不总是像重组一样简单。如果这个人(如我)有一个模拟服务器需要在项目代码之前部署?请回答关于如何控制部署顺序的问题。 – vinnybad 2012-08-06 22:00:54

+0

不回答问题。 – user43685 2012-12-06 14:17:08

+1

你是对的 - 它没有。所以,如果它对这个权利进行了反对票。这就是说 - 我只是说 - 如果你有一个建筑,这取决于应用程序必须上的某种顺序 - 这是一种气味。不知道这意味着什么 - 但这是不对的。我相信你可以找到发布问题的解决方案。我只是指出你正在追逐错误的问题,并再次 - 同意我没有回答这个问题。 – 2012-12-06 17:45:24

1

重新构造你的应用程序太多了解您的具体问题为核心加插件。将核心代码放入shared/lib文件夹,webapps可以从那里访问它。

6

不要听“坦率地说”和“重新构造”,他们显然是在一个完全控制的环境中工作的。我工作在一个大规模分布式的系统上,我们的Web应用程序分散在数百台机器上,其中一些Web应用程序来自其他供应商,所以我不能“重新构造”。为了启动许多服务,他们需要与其他服务通信以获取配置信息。如果该服务不存在,则新服务无法启动。在生产中,有些东西真的永不停机(负载均衡,HA等),但是当我需要在笔记本电脑上设置开发环境时,我遇到了这个问题。我发现的最简单的解决方案是,按照它们要开始的顺序,按字母顺序命名我的webapps(或者,如果您希望webapp名称与您的生产webapps相似,那么请在webapp的开头添加一个额外的字母)。您也可以使用多个Tomcat安装(组织您的web应用程序并以正确的顺序启动Tomcat实例),但这会带来很多开销。最后的选择是使用你的启动脚本以适当的顺序部署你的.war文件(中间有足够的睡眠时间来使它工作)。

+1

一切都很顺利,直到某些事情花费比您预计的更长的时间,或者您没有预料到的事情(或者您移植到以不同顺序列出文件的操作系统;最后我听说,按字母顺序不能保证!) 。然后比赛条件和错误比比皆是。也许你很高兴处理这件事,但我不会。更好地修复应用程序,而不是像这样的胶带。期。 – cHao 2011-11-17 10:40:38

+0

同意cHao - “坦率地说”:) – 2012-12-06 17:46:50

0

这是相当容易做到,如果你不小心黑客一点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)只要你在里面的正确顺序宣布所有的Web应用程序在你的服务器的XML主机标签()

令人难以置信,因为它看起来,它解决了问题,注册类主标签:

<Host> 
<context app1> 
<context app2> 

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

3

确实,tomcat没有提供任何方式来执行部署顺序。

Tomcat的部署的webapps按照以下顺序:

1.Any上下文描述符将会首先部署。

2.未被任何上下文描述符引用的爆炸式Web应用程序将被部署。如果他们在的appBase相关的.WAR文件,它比展开的Web应用程序更新,展开的目录将被删除,web应用程序将从.WAR

3.WAR文件重新部署将部署

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

如果要指定部署顺序再定义一个上下文在$ CATALINA_BASE你的web应用程序/ conf目录/ [引擎]/[主机名] /MyApp.xml

Tomcat扫描$ CATALINA_BASE/conf/[enginename]/[hostname]/by per形成File listFiles(),它返回一个按哈希值排序的文件数组(依赖于操作系统)。

您可以使用下面的代码,以检查那些为了web应用将被部署

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

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

+0

+1我面临类似的问题,并根据您的想法解决:) – 2014-11-18 06:54:55

相关问题