作者:Abhijit Patil, Seetharam Param
在J2EE生产环境中升级正在运行的应用程序并不是一件容易的事情。要么必须解除旧的应用程序版本的部署,并部署新版本的应用程序(这样会导致应用程序暂时性的停止运行);要么必须安装其他的服务器/集群,以便发送新的请求。
BEA WebLogic Server 9.0支持一项称为“生产环境重新部署”(production redeployment)的功能,该功能提供了一种在生产环境中无缝升级应用程序而不影响应用程序运行的方法。重新部署应用程序的新版本之后,所有新的客户端连接请求均转至新的应用程序。现有的客户端连接请求将一直使用旧版本的应用程序,直到关闭所有现有的连接之后,旧版本被解除部署或者停止使用。应用程序的新旧版本相互之间完全孤立,不共享任何资源。换句话说,可以通过为应用程序指定停止时间来停止使用旧的应用程序版本。
本文利用一个示例应用程序来举例说明该项功能。
要求
目前,WebLogic Server 9.0支持的这项生产环境重新部署功能仅针对Web应用程序(WAR)模块和企业应用程序(EAR)。所有其它类型的存档文件(EJB JAR、JCA RAR、WebServices存档文件、JMS或JDBC独立模块)都不支持。EAR可以包含所支持的所有模块类型,但WebServices存档文件除外。生产环境重新部署功能仅支持HTTP客户端,而不支持java客户端。利用不受支持的存档文件类型尝试执行生产环境重新部署功能将会导致错误。要重新部署此类模块,请移除其版本标识符并显式地重新部署模块。
此外,利用该项功能仅能重新部署经过版本化的(versioned)应用程序。版本化的应用程序是指在应用程序存档文件清单中指定有应用程序存档版本的应用程序。
在对应用程序执行生产环境重新部署操作之前,已部署的应用程序必须指定一个版本号。也就是说,不可以部署未经版本化的应用程序,然后再利用该应用程序的新版本执行生产环境重新部署功能。
在同一时间,WebLogic Server 9.0最多只能承载一个应用程序的两种不同版本。此外,在重新部署一个应用程序的新版本时,不能改变该应用程序的部署目标、安全模式或永久存储设置。要改变以上任一特性,必须首先解除部署活动的应用程序版本。
应用程序版本信息
应用程序版本信息可以在MANIFEST.MF文件的WebLogic-Application-Version属性中指定。清单是一个特殊的文件,它包含关于一些打包在一个JAR文件中的文件的信息。利用清单中所包含的“元”信息,可以将该JAR文件用于各种目的。
例如,一个应用程序存档版本为“v1”的应用程序存档文件具有以下的清单内容:
Manifest-Version: 1.0
Created-By: 1.4.1_05-b01 (Sun Microsystems Inc.)
WebLogic-Application-Version: v1
应用程序存档版本是一个仅包含以下字符的字符串:字母和数据的混合(“A”-“Z”、“a”-“z”、“0”-“9”)、句号(“.”)、下划线(“_”)和连字号(“-”)。应用程序存档版本的长度应少于215个字符。此外,应用程序存档版本字符串不能是“.”或“..”。可以利用清单文件指定应用程序的版本,也可以使用Deployer工具的-appversion选项指派一个版本。MANIFEST.MF文件中指定的值比-appversion值优先级高。
在考虑重新部署可版本化的应用程序时,版本号非常重要。如果指定了新的应用程序存档版本,WebLogic Server将会利用版本隔离执行生产环境重新部署;如果指定了相同的应用程序存档版本,WebLogic Server就会执行就地重新部署。
一个示例版本化应用程序
所附的示例应用程序(VersionedApp1)包含一个Web应用程序,它具有三个JSP文件:
- versionedjsp.jsp文件包含一个简单的print语句。
- invalidatesession.jsp文件包含一个session.invalidate()命令,其目的是使所有的会话无效。
- timeoutsession.jsp文件包含设置会话超时值的代码。
另一个应用程序(VersionedApp2)也包含一组相应的文件,但versionedjsp.jsp文件显示信息有所不同。
我们将利用这两个应用程序来演示版本化过程。
部署应用程序
本文所提供的示例应用程序的清单文件中没有包含版本信息。如果希望利用一个清单文件中不包括版本信息的应用程序来使用生产环境重新部署功能,那么Deployer将使您可以在部署或者重新部署应用程序时,利用-appversion选项手动指定一个独有的版本字符串。运行该命令,将应用程序部署为版本version1:
java weblogic.Deployer -adminurl http://localhost:8802
-username weblogic -password weblogic -name VersionedApp
-targets adminServer
-deploy -source C:/tmp/VersionedApp1 -appversion version1
Deployer是一个基于Java的部署工具,它可以为WebLogic Server部署API提供一个命令行接口。Deployer针对的对象是希望执行基于命令行的交互式部署操作的管理员和开发人员。
注意,仅当部署源文件未在MANIFEST.MF文件中指定版本字符串时,才能使用-appversion指定版本字符串。对于那些清单文件中包含版本信息的应用程序,不需要再提供-appversion选项。
还可以利用Deployer的-listapps命令从命令行显示已部署的应用程序的版本信息。因此,举例来说,在部署上述应用程序之后,即可运行该命令来显示应用程序的版本信息:
java weblogic.Deployer -adminurl http://localhost:8802-user weblogic -password weblogic -listapps 重新部署该应用程序的新版本
现在,我们已经部署了该应用程序,让我们来看一下如何重新部署它。由于部署文件的清单文件中没有包含版本信息,如上所述,我们需要利用-appversion选项来执行重新部署:
java weblogic.Deployer -adminurl http://localhost:8802
-username weblogic -password weblogic -name VersionedApp
-targets adminServer -redeploy -source
C:/tmp/VersionedApp2 -appversion version2
如果您要指定一个固定的时间周期,之后就解除部署旧版本的应用程序(不管客户端是否完成工作),可以使用-redeploy命令和-retiretimeout选项。
(-retiretimeout指定一个秒数,此后旧版本的应用程序就停止使用):
java weblogic.Deployer -adminurl http://localhost:8802
-username weblogic -password weblogic -name VersionedApp
-targets adminServer -redeploy -source
C:/tmp/VersionedApp2 -appversion version2 -retiretimeout 300
在WebLogic Server还没有停止使用一个应用程序版本时,您可以立即解除部署该应用程序版本,而不需要等待停止操作的完成。这一点可能很有必要,例如在下面的情况中:应用程序仍然处于停止使用状态中,只有一两个长期运行的客户端会话,而您并不想维持它们。要强制解除部署停止使用的应用程序版本,可以使用-undeploy命令并指定应用程序版本:
java weblogic.Deployer -adminurl http://localhost:8802
-username weblogic -password weblogic -name VersionedApp
-targets adminServer -undeploy -name VersionedApp
-appversion version1
如果没有利用-appversion选项显式指定应用程序版本,WebLogic Server就会解除部署活动的以及所有已停止使用的应用程序版本。
验证部署
部署应用程序的第一个版本之后,打开浏览器,然后调用versionedjsp.jsp:
http://localhost:8802/VersionedApp/versionedjsp.jsp
这样就建立了与VersionedApp1应用程序之间的HTTP会话。在浏览器的窗口中,我们将会看到“Output from VersionedApp1 JSP”的消息。部署VersionedApp2应用程序之后,打开另一个浏览器窗口,然后调用versionedjsp.jsp。现在,我们将会从VersionedApp2应用程序中看到“Output from VersionedApp2 JSP”消息。这时,这两个应用程序版本都处于活动状态。
现在,从第一个浏览器窗口调用invalidatesession.jsp:
http://localhost:8802/VersionedApp/invalidatesession.jsp
这样就会导致所有已建立的与VersionedApp1应用程序的会话无效。让我们看一下服务器控制台窗口。停止过程应该已经启动了。等待停止过程完成,然后从第一个浏览器窗口调用versionedjsp.jsp:
http://localhost:8802/VersionedApp/versionedjsp.jsp
这时,就可以从VersionedApp2应用程序看到“Output from VersionedApp2 JSP”消息。.
回滚生产环境重新部署过程
回滚生产环境重新部署过程可改变活动应用程序和停止使用的应用程序的状态,并相应地重定向新的客户端连接请求。如果检测到新部署的应用程序版本存在问题,并且希望使客户端停止访问该应用程序,那么回滚生产环境重新部署过程就很有必要。
要回滚生产环境重新部署过程,可以再输入一个-redeploy命令,然后指定旧版本的部署源文件:
java weblogic.Deployer -adminurl http://localhost:8802
-user weblogic -password weblogic -redeploy
-name VersionedApp C:/tmp/VersionedApp1
-retiretimeout 300
结束语
生产环境重新部署是一个非常强大的功能。通过该项功能,客户可以在生产环境下透明地进行应用程序升级,而不会引起客户端的中断。生产环境重新部署功能不只需要的硬件资源很少,还可以为应用程序的可用性提供更大的灵活性和更好的控制。在生产环境下无疑应该考虑使用该项功能,它不仅可以使管理员的工作变得更为轻松,而且还可以将终端用户的中断减至最少。 |