我在一个tomcat 5.5容器中部署了许多war项目。他们通过http消费彼此的服务,因此我需要确保在重新启动Tomcat时,它们按特定顺序部署。 googlin'几个小时后,没有运气。
任何人都知道如何设置tomcat 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)
坦率地说,你需要重新审视你的架构。
您的应用程序彼此紧密耦合。
你可能应该有一些控制器应用程序,并让所有应用程序注册它或类似的东西。
这只是在黑暗中拍摄而不太了解您的具体问题