Java 在单独的进程中运行webapps

Java 在单独的进程中运行webapps,java,web-applications,Java,Web Applications,我想运行一个web容器,其中每个webapp都在自己的进程(JVM)中运行。传入的请求由在端口80上运行的代理webapp转发到各个webapp,每个(webapp)在其自己的JVM中的自己的端口上运行 这将解决三个问题: 无法重新启动使用JNI(JNI代码在重新启动之间更改)的Web应用程序。无法保证在加载新的webapp之前已对旧的webapp进行垃圾收集,因此当代码调用System.loadLibrary()时,JVM抛出:java.lang.UnsatifiedLinkError:本机

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

这将解决三个问题:

  • 无法重新启动使用JNI(JNI代码在重新启动之间更改)的Web应用程序。无法保证在加载新的webapp之前已对旧的webapp进行垃圾收集,因此当代码调用System.loadLibrary()时,JVM抛出:
    java.lang.UnsatifiedLinkError:本机库x已加载到另一个类加载器中。
  • 每次重新加载webapp时,库都会泄漏内存,最终迫使服务器完全重启。Tomcat在解决这个问题方面取得了进展,但它永远不会被完全解决
  • 更快的重新启动。我提议的机制将允许近乎即时的webapp重启。我们不再需要等待旧的webapp完成卸载,这是最慢的部分
我已经发布了一个RFE和。我想知道你的想法


现在有没有任何现有的web容器可以做到这一点?

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

不,抱歉,没有一个这样做,可能是因为Java web容器强调遵循servlet API,即每个http请求派生一个线程。您想要的是JVM级别的分叉,而这并不是标准的Java习惯用法。

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


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

我结束这个问题,因为我似乎遇到了死胡同:


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

通过为多个webapp提供一个单一的管理界面,您可以提高生产率,这是目前使用单独的容器所无法做到的。例如:当用户要求重新加载一个webapp时,您可以预加载容器减去后台闲置的webapp。当重新加载请求进来时,您只需关闭旧的JVM,并将新的webapp加载到等待的JVM中。如果我今天要实现这一点,那么关闭实例并连续重新启动它将花费更长的时间(从而降低开发效率)。我不需要webapp来跨越JVM。据我所知,除了重新启动整个JVM之外,没有安全的方法可以重新启动JNI应用程序,因此特殊的类装入器策略在这里不起作用。我将每个webapp隔离在自己的JVM中,而不是同一webapp的每个请求。