在单独的进程中运行webapps

时间:2011-06-13 16:08:21

标签: java web-applications

我想运行一个Web容器,其中每个webapp都在自己的进程(JVM)中运行。传入请求由端口80上运行的代理Web应用程序转发到各个Web应用程序,每个Web应用程序(webapp)在其自己的JVM中的自己的端口上运行。

这将解决三个问题:

  • 无法重新启动使用JNI(JNI代码在重新启动之间更改)的Web应用程序。在加载新的webapp之前,无法保证旧的webapp已被垃圾收集,因此当代码调用System.loadLibrary()时,JVM会抛出:java.lang.UnsatisfiedLinkError: Native Library x already loaded in another classloader.
  • 每次重新加载webapp时,库都会泄漏内存,最终会导致服务器重新启动。 Tomcat在解决这个问题方面取得了进展,但它永远不会完全修复。
  • 重启速度更快。我提议的机制将允许近乎即时的webapp重启。我们不再需要等待旧的webapp完成卸载,这是最慢的部分。

我发布了一个RFE herehere。我想知道你的想法。

现有的网络容器今天都这样做吗?

4 个答案:

答案 0 :(得分:1)

我正在结束这个问题,因为我似乎陷入了死胡同:http://tomcat.10.n6.nabble.com/One-process-per-webapp-td2084881.html

作为一种解决方法,我手动为每个webapp启动一个单独的Jetty实例。

答案 1 :(得分:0)

你不能只为每个容器部署一个应用程序,然后使用DNS条目和反向代理来完成同样的事情吗?我相信Weblogic以托管域的形式有这样的东西。

答案 2 :(得分:0)

不,AFAIK,他们都不这样做,可能是因为Java Web容器强调遵循servlet API - 每个http请求都会旋转一个线程。你想要的是JVM级别的分支 - 而这根本不是标准的Java习语。

答案 3 :(得分:0)

如果我理解正确,您要求为企业级服务器提供标准功能,例如IBM的WebSphere Network Deployment(我为IBM工作的免责声明),您可以在其中跨多个JVM分发应用程序,而这些JVM实际上可以分布在许多物理上机等。

我不确定你的基本前提是否正确。没有必要重新启动整个JVM以部署新版本的应用程序。许多应用服务器将使用类加载器策略,允许它们丢弃应用程序的版本并加载新版本。