内部热部署如何工作?

2022-09-04 22:06:51

我正在使用 eclipse 服务器功能进行热代码部署。使用tomcat作为Web服务器。但我不确定它是如何工作的。我有自己的理解,它必须如何在内部工作。

我的理解 :-当开发人员对代码进行更改(例如类 Employee)时,Eclipse 会将修改后的编译类放在 Web 服务器下的正确位置(必须是特定的 web/app 服务器。让我们称之为热部署目录(HDD))。现在,Web服务器特定的类装入器将进入画面。它在 HDD 下找到新条目。现在,它发现类已经由类加载器在perm gen空间中加载,Web服务器将从permgen空间中卸载它,并在内部加载新的类,而无需重新启动服务器,以便反映新的更改(字节码)。作为重新加载的一部分,Web服务器还将现有的Epmloyee对象与perm gen空间中的新类定义链接,以便反映新的更改。

我的理解是否正确?

像这样的些链接说Eclipse热部署只是重新部署的自动化。我相信这意味着eclipse会自动停止服务器 ,重新发布并重新启动它,而无需开发人员干预。但是我认为它不是真的,因为与启动/发布/重新启动相比,此过程确实很快。另外,如果这是真的,那么会话和其他活动对象在重新启动后将如何保持活动状态?也许这个链接在过去是正确的,但现在不是,因为我发现热部署也适用于jar中的类


答案 1

热代码部署取决于运行时功能。您链接到的答案并不意味着自动化会停止服务器部署新代码并再次启动服务器。这将是浪费的。

相反,大多数 Java 应用程序服务器都能够重新部署应用程序。这意味着服务器将创建一个新的 Web 应用程序类装入器,通过这个新的类装入器装入应用程序的新版本,在某些情况下,它将迁移状态(序列化/反序列化 HTTP 会话),并删除应用程序的旧版本。

现在,重新部署速度很大程度上取决于应用程序本身 - 应用程序如何初始化。是否必须预热缓存?它是否必须满足依赖关系(a-las Spring,CDI)?它是否必须初始化Hibernate SessionFactory?这涉及许多因素。

Eclipse WTP 自然而然地可以触发应用程序容器的重新部署过程 - 仅此而已。当然,一个小型应用程序不会花很长时间来重新部署。

除非有一个特殊的运行时技术/容器/框架,并且有一个为Eclipse开发的特殊连接器,以利用一个钩子来触发针对该特定技术更新的热代码。一个很好的例子是用于OSGi运行时的bndtools

只是为了消除一些困惑:

人们经常混淆热交换热部署。第一个是HotSwap,它是JVM在运行时更新类定义的能力。后一种是热部署,即应用程序服务器自动部署应用程序(增量或非增量部署)的能力,而无需重新启动 JVM 进程。

所以我的答案是关于热部署,而不是关于HotSwap。因此,我将热部署称为“自动化”,而不是平台的基本机制。


答案 2