最近有一个平台级应用要上线,其中有一台服务器上跑了一个超级大应用,由数家公司共同开发,包含20来个子系统。为了稳妥起见,申请了一台新的服务器,先在新服务器上布署老的系统,然后更新平台。这样需要把原来WebLogic方面的配置迁移到新环境中来,我记得WLST有这方面的功能,可以把config.xml文件导出为Jython脚本,然后在新的WebLogic服务器上执行就可以完成应用迁移。因为这些应用大多是Struts+Spring+Hibernate的应用,从WebLogic角度看就是一个Web应用而已。相关的WebLogic配置主要是一些ConnectionPool和Datasource等,因为是多家公司配置的,所以我想把配置带密码一块搬过去,后来发现我的这种想法是行不通的。
WLST是WebLogic Script Toolkit的简称,下载地址https://wlst.projects.dev2dev.bea.com/。这个工具在8.1的时候提供免费下载,9.0开始集成到WebLogic中去了,取代了原来的WebLogicAdmin系列命令。有Online和Offline两个版本,Offline版比较大,可以创建Domain,这里用的是Online版。
启动前要做一些准备工作,我写了一个简单的wlst.bat文件,如下:
@echo off
setlocal
set JAVA_HOME=D:/bea81/jdk142_11
SET WLS_HOME=D:/bea81/weblogic81
SET WLST_DIR=D:/DevTools/wlst_v64
set PATH=%JAVA_HOME%/bin;%WLS_HOME%/server/bin;%PATH%
SET CLASSPATH=%CLASSPATH%;%WLS_HOME%/server/lib/weblogic.jar
SET CLASSPATH=%CLASSPATH%;%WLST_DIR%/wlst.jar
SET CLASSPATH=%CLASSPATH%;%WLST_DIR%/jython.jar
java weblogic.WLST
endlocal
@echo on
然后就可以执行configToScript(“…//config.xml”,”…//config.py”)命令,会在指定的目录下生成两个文件config.py和config.py.properties。config.xml中所有修改过的配置都会写到config.py中。执行这条命令无需登陆AdminServer,只要能找到config.xml就行。
把这两个文件拷贝到新的服务器上,第一件事情是在config.py中修改config.py.properties的路径,在def initConfigToScriptRun():的loadProperties("c:/temp/config56.properties")处,以便执行脚本时能找到相应的配置文件。因为我只需要复制JDBC相关的配置,所以还需要去掉很多无关的东西。
因为对Python不是很熟悉,一开始没有什么头绪,创建domain时尽量保持相关配置完全一样,比如domain的名称,AdminServer的名字等,然后就开始执行。首先connect(“username”, “password”, “ADMIN_URL”)ADMIN_URL如t3://localhost:7001等。然后执行execfile(‘…//config.py’)。注意execfile好像没有帮助,也就说help(‘execfile’)说找不到相关的东西。接下来就是不断地修改错误,因为两个服务器的配置还是有差别的,最大的一个差别是,老服务器名字在安装WebLogic后修改过,所以NodeManager会有问题,得重新创建一个新的KeyStore才能保证key的名字和服务器名字相同。而在新的服务器上这一点是不必要的。
最先想到的办法是把Keystore有关的部分注释掉,跑着跑着除了别的问题,另外发现别的问题,如Server已经创建而出错等,有些配置无需更新过来,如SSL等。后来慢慢看出点门道来了,这个Jython文件,一开头是一堆函数定义,最后是对这些函数的调用。如下:
# Calling all the defined Functions ...
# define this global variable
startedNewServer=0
initConfigToScriptRun()
Server_landman0()
Server_GisServer1()
Server_zhywServer2()
#
# Targets that may be used
serverTarget1 = getTarget("Server/"+GisServerSERVER)
serverTarget2 = getTarget("Server/"+zhywServerSERVER)
serverTarget0 = getTarget("Server/"+landmanSERVER)
SSL_landman3()
WebServer_landman4()
Log_landman5()
ExecuteQueue_weblogic_kernel_Default6()
只要把调用这些函数的地方注释掉就可以了,函数定义可以不去理它,于是我把除JDBC方面的东西保留外,其它全部注释掉,速度比原来快了很多。