【发布时间】:2010-03-29 15:42:25
【问题描述】:
我在单个 tomcat 5.5 容器中部署了许多战争项目。它们通过 http 使用彼此的服务,因此我需要确保在重新启动 Tomcat 时,它们以特定的顺序部署。在谷歌搜索了几个小时后,没有运气。
有人知道如何设置 tomcat 5.5 以在重启时按特定顺序部署战争吗?
提前致谢
【问题讨论】:
标签: deployment tomcat
我在单个 tomcat 5.5 容器中部署了许多战争项目。它们通过 http 使用彼此的服务,因此我需要确保在重新启动 Tomcat 时,它们以特定的顺序部署。在谷歌搜索了几个小时后,没有运气。
有人知道如何设置 tomcat 5.5 以在重启时按特定顺序部署战争吗?
提前致谢
【问题讨论】:
标签: deployment tomcat
不要听“坦率地说”和“重组”,他们显然是在一个完全可以控制的环境中工作。我在一个大规模分布式系统上工作,我们的 Web 应用程序分散在数百台机器上,其中一些 Web 应用程序来自其他供应商,所以我无法“重组”。
为了启动许多服务,它们需要与其他服务通信以获取配置信息。如果该服务不存在,则新服务将无法启动。在生产中,有些东西确实永远不会关闭(负载平衡、HA 等),但是当我需要在我的笔记本电脑上设置开发环境时,我遇到了这个问题。
我找到的最简单的解决方案是按字母顺序命名我的 webapps 他们开始的顺序(或在开头添加一个额外的字母 如果您希望 webapp 名称合理类似于 您的生产网络应用程序)。
您还可以使用多个 Tomcat 安装(组织您的 web 应用 并以正确的顺序启动 Tomcat 实例),但这是一个 很多开销。
最后一个选择是使用您的启动脚本来部署您的 .war 文件以适当的顺序(在 之间以使其工作)。
【讨论】:
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());
}
适当地命名部署描述符将解决您的问题。
【讨论】:
将您的应用重新构建为核心加插件。将核心代码放入 shared/lib 文件夹,webapps 可以从那里访问它。
【讨论】:
如果您不关心 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。
【讨论】:
坦率地说,您需要重新审视您的架构。
您的应用程序彼此之间的耦合过于紧密。
您可能应该有一些控制器应用程序并让所有应用程序都向它注册或类似的东西。
这只是在不了解您的具体问题的情况下在黑暗中拍摄
【讨论】: