我们已经有了一个Java应用程序服务器上运行的计算机数量,都连接到互联网的一些背后的防火墙。我们需要远程更新的罐子文件和启动脚本,从一个中央网站,没有明显的中断。

该进程已被人参与和万无一失(即我们不能打破应用程序,由于不合时宜的互联网中断).

在过去我们已经使用了各种各样的外部脚本和公用事业来处理类似的任务,而是因为他们有自己的依赖关系,结果是更难以维持和少便携式。之前使新的东西,我想要得到一些输入的社区。

有人发现了一个很好的解决方案吗?有任何想法或建议?

只是澄清:这个应用程序服务器,但不是对于网络的应用程序(没有webapp容器或战争的文件)。这只是一个自治Java程序。

有帮助吗?

解决方案

您没有指定服务器应用程序的类型 - 我将假设您没有运行Web应用程序(因为部署WAR已经完成了您正在谈论的内容,并且您很少需要Web应用程序来如果您正在谈论一个Web应用程序,以下讨论仍然适用 - 您只需实现WAR文件的更新检查和乒乓而不是单个文件。

您可能想看看jnlp - WebStart基于此(这是一种客户端应用程序部署技术),但我非常确定它可以针对服务器类型应用程序执行更新而定制。无论如何,jnlp在提供可用于下载所需JAR所需版本的描述符方面做得相当不错......

对此有一些一般性的想法(我们在同一个桶中有几个应用程序,并且正在考虑自动更新机制):

  1. 考虑使用bootstrap.jar文件,该文件能够在启动应用程序之前读取jnlp文件并下载所需/更新的jar文件。

  2. 即使应用程序正在运行,也可以更新JAR文件 (至少在Windows上,这是最有可能对运行文件进行锁定的操作系统)。如果您使用自定义类加载器,或者您有一堆可能随时加载或卸载的JAR,您可能遇到问题,但如果您创建机制来防止这种情况,那么覆盖JAR然后重新启动应用程序应该是足以更新。

  3. 即使可以覆盖JAR,您也可以考虑使用ping路径的ping-pong方法(如果您还没有将应用程序启动器配置为自动读取所有jar文件) lib文件夹并自动将它们添加到类路径中,然后这就是你真正想做的事情)。以下是乒乓球的工作原理:

  4. 应用程序启动并查看lib-ping \ version.properties和lib-pong \ version.properties并确定哪个更新。假设lib-ping有更高版本。启动程序搜索lib-ping * .jar并在启动期间将这些文件添加到CP。当你进行更新时,你可以将jar文件下载到lib-pong中(或者如果你想节省带宽而从lib-ping复制jar文件,而JAR实际上并没有改变 - 尽管这很费劲!)。将所有JAR复制到lib-pong后,最后要做的就是创建version.properties文件(这样就可以检测并清除导致部分lib文件夹的中断更新)。最后,你重新启动应用程序,并且bootstrap选择了lib-pong是所需的类路径。

    1. 如上所述的乒乓球允许回滚。如果你正确地设计它,你可以拥有一个你测试的应用程序,然后永远不会更改检查,看它是否应该回滚给定的版本。这样,如果你搞砸并部署破坏应用程序的东西,你可以使版本无效。应用程序的这一部分只需要从坏的lib- *文件夹中删除version.properties文件,然后重新启动。保持这部分很简单是很重要的,因为这是你的安全故障。

    2. 您可以拥有2个以上的文件夹(而不是ping / pong,只需要lib-yyyymmdd并清除除最新的5之外的所有文件夹)。这允许更高级(但更复杂!)回滚JAR。

其他提示

你绝对应该看看OSGi,它是为这些情况(特别是嵌入式产品)创建的,并被许多公司使用。您可以在应用运行时更新jar" bundles",添加和删除它们。我自己没有使用它,所以我不知道开源框架/服务器的质量,但这里有一堆有用的链接可以帮助你入门:

http://www.osgi.org/Main/HomePage
http://www.aqute.biz/Code/Bnd
http://blog.springsource.com/2008/02/18 /创建-OSGi的捆绑/ 结果 http://blog.springsource.com/
http://www.knopflerfish.org/
http://felix.apache.org/site/index.html

这是很难做更新的原子,尤其是如果你有任何的数据库更新以做到的。

但是,如果你不要,你可以做什么是第一个确保应用程序可以从一个相对的道路。也就是说,你可以把你的应用在一些目录,以及所有重要的文件被发现的相对位置,这样,您的实际安装位置是不是真的重要。

接下来,重复你的安装。现在,你有"运行"的版本,你有"新的"版本。

更新的"新的"版本的使用不管你喜欢新技术(FTP,可、纸张带子,不管你的船浮筒).

验证你的安装(校验,快速部测试,无论你需要什么--即使开始了一个试验港口如果你等)。

当你快乐的新的安装、下来的原始的运行实例,重新命名的原始目录(mv应用程序application_old),重新命名的新目录(mv application_new应用程序),并开始回升。

你的停机时间减少到服务器关闭和开始时间(由于重新命名为"免费").

如果,通过机会,检测到一个严重的错误,你有你的原始版本仍然存在。停止新的服务器,它重新命名后,重新启动。非常快速的回落。

其他好的事情,那是你的服务基础设施是静态的(像你rc脚本,cron工作,等等。) 因为他们点的"应用"目录,它不会改变。

它也可以做用的软链接,而不是重新命名目录。无论哪种方式是好的。

但在技术简单,并附近的防弹如果应用程序相配合。

现在,如果你有DB变化,好,这是完全不同的讨厌的问题。理想的是如果你可以让数据库的更改"后向兼容",那么希望的旧应用程序版本可以运行的新架构,但这并不总是可能的。

如果您使用基于OSGi的应用服务器,例如,我相信您可以热部署JAR文件SpringSource dm Server 。我自己从未使用它,但是知道Spring产品组合的一般质量,我相信它值得一看。

我们使用OSGi更新系统的Eclipse,我们的经验非常好。

推荐!

最新版本的Java网开始允许用于注入的应用程序在当地的高速缓存没有实际援引的程序和它可以"离线"。由于高速缓存是用于援用该程序,它将更新为下一只.对于这个工作,你将最有可能需要的罐子版本号以他们的名义(例如our-library-2009-06-01.jar).

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top