Java - 热部署

时间:2012-03-20 15:13:09

标签: java erlang hotdeploy

最近,我正在阅读有关具有热部署功能的Erlang的书。可以在不降低系统的情况下完成部署。所有现有请求都将由旧版本的代码处理,部署后的所有新请求将由新代码提供。在这些情况下,两个版本的代码在运行时可用,直到所有旧请求都被提供。在Java中有什么方法可以保留2个版本的jar文件吗?是否有任何app / web服务器支持此功能?

5 个答案:

答案 0 :(得分:4)

如果您的目的是加快开发速度,那么JRebel就是这个目的的工具。但是,我不建议使用它来修补生产系统。

JRebel会在类文件发生更改时检测到并将其重新加载到正在运行的应用程序服务器中,而不会丢弃任何旧状态。与大多数应用程序服务器重新部署完整初始化过程必须重新运行的整个war / ear时相比,这要快得多。

答案 1 :(得分:2)

生产应用程序热更新的唯一原因是为用户提供零停机时间。

LiveRebel(基于JRebel)是可以与Jenkins结合使用的工具。它可以在排放生产群集上的会话时执行安全的热修补以及滚动重新启动。

答案 2 :(得分:1)

在Java世界中有很多方法可以实现热部署,因此您可能需要更具体地了解您的上下文以及您要实现的目标。

以下是一些需要考虑的良好线索/选项:

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

答案 3 :(得分:1)

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

我建议只使用JBoss并重新部署你的罐子和战争。大部分都很简单。

在任何一种情况下,您都要确保没有任何内存泄漏,因为在重新部署后,您将耗尽PermGen空间。

答案 4 :(得分:0)

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