我只想运行部署在 tomcat 5.5 中的 web 应用程序的一个实例,如何实现它。
例如,如果系统有 2 个 tomcat 服务器,每个服务器都有 web 应用程序名称 xxx,我不希望这两个应用程序并行运行,而一次只应运行一个。
假设用户访问 tomcat 1 中的 index.jsp,然后当他尝试从 tomcat 2 访问 index.jsp 时,这种情况不应该发生
答案1
以下是workaround
实现此目的的一种方法(假设两个 Tomcat 实例都在同一主机上):
- 使用 docBase 参数从其自己的路径部署 webapp,而不是将其物理复制到
webapp
两个 Tomcat 的单独目录下 - 在你的 servlet
contextInitialized
方法中启动一个服务器套接字在特定端口上,例如:5555 - 如果您无法启动 ServerSocket 并且它抛出异常,则捕获该异常并从相同的 contextInitialized 方法重新抛出 RuntimeException。
这样,一旦启动应用程序的第一个实例,它就会开始侦听该端口5555
。现在,当您启动第二个实例时,它显然无法获取端口,5555
因为它已在使用中,并将导致 RuntimeException,这反过来又会导致 Tomcat **不部署**同一 webapp 的第二个实例。