2012-03-20 226 views
4

最近,我正在阅读关于具有热部署功能的Erlang的书。部署可以在不关闭系统的情况下完成。所有现有的请求都将由旧版本的代码处理,部署后的所有新请求都将由新代码提供服务。在这种情况下,两种版本的代码在运行时可用,直到所有旧请求都被服务。在Java中,我们可以保留2个版本的jar文件吗?有没有任何应用/网络服务器支持这个?Java - 热部署

+0

我相信Tomcat支持1,尽管我不知道它是否在生产环境中被建议。 – cdeszaq 2012-03-20 15:14:33

+0

您可以在群集环境中使用大多数Java应用程序服务器(如Glassfish/Websphere/Weblogic)来执行此操作。 – 2012-03-20 15:15:49

+1

JBoss也支持这一点。然而,这是否可取是有争议的。 – mcfinnigan 2012-03-20 15:16:05

回答

1

有很多方法可以在Java世界中实现热部署,因此您可能需要针对您的上下文以及您试图实现的目标来更具体一些。

这里有一些很好的线索/选择可以考虑:

  • OSGi是支持热部署
  • Clojure是一个动态的JVM语言,它使大量的运行时交互的一个通用模块系统。 Clojure通常用于“实时编码” - 几乎任何东西都可以在运行时进行热插拔和重新定义。 Clojure是一个功能强大的语言,强调不变性和并发性,因此在某些方面与Erlang有一些有趣的相似之处。 Clojure有一些非常漂亮的web框架,如Noir,适用于热交换web srever代码。
  • Play Framework设计用于启用热交换代码,以提高生产力(避免重新启动Web服务器)。如果您主要关注热交换Web应用程序,则可能是相关的。
  • 大多数Java应用服务器(如JBoss)支持某些形式的Web应用程序热插拔。
1

从技术上讲,你可以自己做这个。虽然,我不会推荐它,因为它可以很快变得复杂。但是这个想法是你可以创建一个ClassLoader并加载你的类的新版本。然后确保你的执行代码知道新的ClassLoader。

我会推荐使用JBoss并重新部署你的罐子和战争。绝大多数人都很好,很简单。

在这两种情况下,您都必须确保没有任何内存泄漏,因为您在几次重新部署之后将耗尽PermGen空间。

4

如果你的意图是加快发展,那么JRebel是一个工具,只是为了这个目的。但我不会推荐使用它来修补生产系统。

JRebel在类文件发生变化时进行检测,并在不丢弃任何旧状态的情况下将其重新加载到正在运行的应用服务器中。与大多数应用程序服务器在重新部署整个初始化过程必须重新运行的整个战争/耳朵时所做的相比,这要快得多。

+0

许可证禁止在生产系统上使用JRebel – 2012-03-25 11:26:26

+0

禁止???我想知道为什么....? – 2012-04-02 12:18:08

+0

JRebel是一个开发工具。对于制作,有LiveRebel(http://liverebel.com) – 2012-05-05 18:29:50

2

对生产应用程序进行热更新的唯一原因是为用户提供零宕机时间。例如

LiveRebel(基于JRebel)是可以与Jenkins一起使用的工具。它可以进行安全的热补丁和滚动重启,同时消耗生产群集上的会话。

0

RelProxy添加到您的工具箱中,RelProxy是Java(和Groovy)的热门类重新加载,即使对于生产也能改进开发,只有一个有意义的限制,只能在一部分代码中重新加载。