2012-03-20 224 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)的熱門類重新加載,即使對於生產也能改進開發,只有一個有意義的限制,只能在一部分代碼中重新加載。