使用WLST監(jiān)控WebLogic Server
時(shí)間:2011-02-05 23:59來源:未知 作者:mw123 點(diǎn)擊:292次
介紹WebLogic 腳本工具(WLST,WebLogic Scripting Tool),WLST是一個(gè)幫助編寫遠(yuǎn)程管理和修改服務(wù)器安裝腳本的Jython模塊
為什么用腳本語言呢?是這樣的,如果我有完整的Java編程IDE,用Jython或是Groovy看起來就顯得有些落伍了。雖然可以用較少行來編碼 (雖然不是少很多),但是我希望輸入的編寫能夠自動(dòng)化。我希望編譯器在編碼時(shí)告警,而且我需要分解。這需要Java IDE以外的插件。 但有時(shí)候沒有完整的IDE配置。想一下要自動(dòng)敏捷的工作,或者想一下服務(wù)器管理員。這些人沒有任何像Eclipse之類的東西,而且他們的工作不可能事先完成。不可能為系統(tǒng)管理而編碼。這就是像WLST這類工具產(chǎn)生的來由,它們使得世界更美好。 WebLogic 腳本工具(WLST,WebLogic Scripting Tool)是一個(gè)幫助編寫遠(yuǎn)程管理和修改服務(wù)器安裝腳本的Jython模塊。它有兩個(gè)版本:離線,它可以配置尚不存在的服務(wù)器實(shí)例,以及在線,它需要連接 到一個(gè)WebLogic服務(wù)器。這兩個(gè)版本都是Beta版而且文檔很少,但是它們保證會(huì)改進(jìn)并在將來的某個(gè)WebLogic版本中包含。 這里我們將專注于在線版本,因?yàn)樗墓δ鼙入x線版本更為完整。 使服務(wù)器配置自動(dòng)化: 讓我們從難以對(duì)付的WebLogic服務(wù)器配置開始吧!典型的開發(fā)團(tuán)隊(duì)在幾臺(tái)主機(jī)上復(fù)制同樣的配置,僅僅改變少量參數(shù),如IP、主機(jī)名和TCP端口。在相對(duì)典型的項(xiàng)目中,必須對(duì)每個(gè)開發(fā)人員的PC、集成測(cè)試主機(jī)和生產(chǎn)主機(jī),都要執(zhí)行一遍這個(gè)過程。Ant任務(wù)對(duì)這個(gè)問題有很大幫助,但是它還沒有準(zhǔn)備好處理像定制JMX bean這類的事務(wù)。 我們將創(chuàng)建并裝載服務(wù)器,配置它,然后關(guān)機(jī),混合使用Ant和WLST。首先,讓我們創(chuàng)建清單1中的服務(wù)器。為了簡(jiǎn)化,我們將在這里使用Ant任務(wù),因?yàn)榻Y(jié)合使用WLST離線和在線會(huì)使事情復(fù)雜化。 清單1 build.properties: server=weblogic weblogic.server.name=myserver weblogic.domain.name=mydomain weblogic.admin.username=weblogic weblogic.admin.password=weblogic weblogic.home=C:/bea weblogic.lib.dir=/weblogic81/server/lib weblogic.mbeantypes.dir=/mbeantypes server.project.root.dir=/user_projects/domains/
server.deploy.dir=/applications 我檢查了屬性,因?yàn)樵诙嘤谝粋€(gè)品牌的應(yīng)用服務(wù)器上部署時(shí),很容易使用錯(cuò)誤的build.properties文件(參見清單2)。 清單 2 build.xml: [...] <path id="weblogic.classpath"> <fileset dir=""> <include name="weblogic.jar"/> </fileset> </path> <target name="check-properties"> <condition property="wlproperties.ok"> <and> <isset property="weblogic.server.name"/> <isset property="weblogic.domain.name"/> <isset property="weblogic.admin.username"/> <isset property="weblogic.admin.password"/> </and> </condition> <fail unless="wlproperties.ok"> Weblogic properties are missing. Double check build.properties. </fail> <fail> <condition> <not><available file="/weblogic.jar"/></ not> </condition> Missing file /weblogic.jar </fail> </target> <target name="create-server" depends="check-properties"> <taskdef name="wlserver" classname="weblogic.ant.taskdefs. management.WLServer" classpathref="weblogic.classpath"/> <echo>Creating server at </echo> <delete dir="" includeemptydirs="true" quiet="true"/> <mkdir dir="" /> <wlserver dir="" domainName="" serverName="" host="" port="" generateConfig="true" productionModeEnabled="false" weblogicHome="/weblogic81" username="" password="" action="start" > <classpath refid="weblogic.classpath"/> </wlserver> 我們剛剛刪除了整個(gè)域目錄,創(chuàng)建了一個(gè)新的、干凈的目錄,并讓服務(wù)器運(yùn)行,這樣,在清單3中,我們可連接并配置它。 清單3 <java classname="weblogic.WLST" fork="true" failOnError="true" dir="scripts/wlst"> <classpath refid="weblogic.classpath"/> <classpath> <fileset dir="lib/wlst"> <include name="*.jar"/> </fileset> </classpath> <arg line="createAll.py" /> </java> <wlserver host="" port="" username="" password="" action="shutdown" /> </target> 停止服務(wù)器是必要的,因?yàn)橛行┰O(shè)置改變了,如安全驗(yàn)證者,需要正常關(guān)機(jī)以保存到磁盤。省略這一步將會(huì)在Ant腳本結(jié)束處突然中止服務(wù)器。 注意:WLST任務(wù)有分叉,因此,如果WLST在腳本中發(fā)現(xiàn)了錯(cuò)誤,Ant仍將會(huì)顯示“成功編譯”,從而會(huì)使得裝載該腳本的人迷惑。 讓我們將WLST腳本分成兩個(gè)部份,這樣在以后的管理任務(wù)中能盡可能多的重用它。我已經(jīng)使用了包含在WLST包中的很棒的例子,并且將 saveDomain()命令的輸出作為起點(diǎn)。saveDomain()生成的腳本不是很完美,但是它能指出工具的可能性(參見清單4)。 清單 4 createAll.py: execfile("AdminTool.py") admin.configureServer() admin.createXaPool() AdminTool.py: from javax.management import InstanceNotFoundException # Python 2.4 will include booleans, but until then this is required true = 1 false = 0 class AdminTool: def __init__(self): loadProperties("administration.properties") # Connects with a weblogic instance def connect(self): connect(username, password, "t3://" + host + ":" + port) self.myServer = getTarget("/Server/" + serverName) # Server attributes that cannot be generated via ant def configureServer(self): # Activates console DEBUG mode - I really like that self.myServer.setStdoutSeverityLevel(64) print "Configured server " + self.myServer.getName() # Creates a JDBC pool: def createPool(self, poolName, driverName): pool = create(poolName, "JDBCConnectionPool") pool.setDriverName(driverName) pool.setURL(dbURL) pool.setPassword(dbPassword) pool.setProperties(makePropertiesObject("user=" + dbUsername)) pool.setRemoveInfectedConnectionsEnabled(false) pool.setTestConnectionsOnCreate(true) pool.setTestTableName("SQL SELECT 1 FROM DUAL") # setTestFrecuencySeconds is not soported by WLST objects # so here is a workaround cd(′/JDBCConnectionPool/′ + poolName) set(′TestFrequencySeconds′, 300) cd(′/′) pool.addTarget(self.myServer) def createXaPool(self): self.createPool(MY_POOL_NAME, ′oracle.jdbc.xa.client.? OracleXADataSource′) # Removes an element if it exists def removeIfExists(self, name, type): try: mbean = home.getAdminMBean(name, type) home.deleteMBean(mbean) print ′Removed the ′ + type + ′: ′ + name except InstanceNotFoundException, e: print "Cannot remove " + name + ",type=" + type + " because ? it does not exist" def removeXaPool(self): self.removeIfExists(MY_POOL_NAME, "JDBCConnectionPool") # The JDBC Connection Pool name MY_POOL_NAME=′MyPool′ # the instance we are going to use admin = AdminTool() admin.connect() administration.properties host=127.0.0.1 port=7001 username=weblogic password=weblogic dbURL=jdbc:oracle:thin::1521:DATABASE dbUsername=foo dbPassword=bar LoadProperties任務(wù)將administration.properties文件中的所有項(xiàng)轉(zhuǎn)換成Jython變量。我們已經(jīng)使用了 Jython類的第一個(gè)方法來管理WebLogic服務(wù)器實(shí)例。還可以輕易將它擴(kuò)展到創(chuàng)建和刪除DataSources,這是一個(gè)JMS環(huán)境,甚至還可以 擴(kuò)展到安全領(lǐng)域。 MBean方法 前面我們已經(jīng)看到的是創(chuàng)建和配置MBeans的一個(gè)方法(下一節(jié)會(huì)解釋另一種方法)。不利的一面是必須知道支持的屬性和方法,而WLST沒有這些文檔。我怎么去猜哪個(gè)方法可用呢? 噢,我想到的第一個(gè)方法是到config.xml文件或是Web控制臺(tái)去找,并假設(shè)屬性名稱未改變。如果有一個(gè)不錯(cuò)的IDE,我們還可以打開Mbean 接口類看看那里有些什么(它和Mbean的名稱一樣,以“Mbean”結(jié)束)。這不會(huì)顯示代碼,但是可以查到哪個(gè)方法可用。 我喜歡連接到http://e-docs./wls/docs81/javadocs/index.html, 查看weblogic.management.configuration包的內(nèi)容。比如,如果我們找到ServerMBean類,就可以看到兩個(gè)有趣的 但是不太為人們所熟悉的方法isJDBCLoggingEnabled()和setJDBCLoggingEnabled()。我們可通過打開wlst交 互shell來查看它們,如下所示: wls:/mydomain/config> server=home.getAdminMBean(′myserver′, ′Server′) (“home”是一個(gè)AdminMbeanHomeImpl類型的變量,可以像對(duì)任何其他Mbean一樣研究;唯一的問題是因?yàn)樗且粋€(gè)內(nèi)部類,所以沒有javadoc可用。) 如果最后三個(gè)命令不好理解,不要擔(dān)心。我們會(huì)在下一節(jié)介紹Shell。 命令行系統(tǒng)管理 系統(tǒng)管理員也可以通過使用交互式shell來手工管理WebLogic服務(wù)器實(shí)例。其優(yōu)點(diǎn)是在試圖修改系統(tǒng)配置時(shí),不用事先知道Mbean接 口。對(duì)這 一部分,需要在classpath包含webLogic.jar、jython.jar以及wlst.jar,并啟動(dòng)主類weblogic.WLST,它 是交互式控制臺(tái)。 要記住這是Jython。引號(hào)和雙引號(hào)用于字符串聲明;實(shí)例化不需要新的運(yùn)算符(事實(shí)上,這是一個(gè)語法錯(cuò)誤);不需要分號(hào),因?yàn)槊啃杏没剀嚱Y(jié)束;而且不必聲明變量(la Unix shell腳本)。如果這還不夠,請(qǐng)參考Python和WLST的文檔。 我們需要開始連接到WebLogic服務(wù)器的實(shí)例。我們可以選擇使用之前編寫的AdminTool腳本,或者手工連接: execfile(′AdminTool.py′) 或 connect(′weblogic′, ′weblogic′, "t3://localhost:7001) Connecting to weblogic server instance running at t3://127.0.0.1:7001 as 成功連接到屬于“mydomain”域的Admin服務(wù)器“myserver”是系統(tǒng)輸出,而且應(yīng)采用編碼的格式。 現(xiàn)在,我們可以開始好好玩一下了。對(duì)于WLST,JMX樹可像UNIX文件系統(tǒng)一樣進(jìn)行遍歷,在這里JMX Mbeans是目錄而其屬性是文件。在所有這些過程中要記住Python語法,并要記得WLST仍然不能分辨通配符。這就是為什么我們要省略大多數(shù) ls()輸出的原因(參見清單5)。 清單5 wls:/mydomain/config> ls() [...] drw-JDBCConnectionPools drw-JDBCDataSourceFactories drw-JDBCDataSources drw-JDBCMultiPools drw-JDBCTxDataSources [...] wls:/mydomain/config> cd(′JDBCConnectionPools′) wls:/mydomain/config/JDBCConnectionPools> ls() drw-MyPool wls:/mydomain/config/JDBCConnectionPools> cd(′MyPool′) wls:/mydomain/config/JDBCConnectionPools/MyPool> ls() [...] -rw-TestConnectionsOnCreatetrue -rw-TestConnectionsOnReleasefalse -rw-TestConnectionsOnReservefalse -rw-TestFrequencySeconds300 -rw-TestStatementTimeout-1 -rw-TestTableNameSQL SELECT 1 FROM DUAL -r--TypeJDBCConnectionPool -rw-URLjdbc:oracle:thin::1521:DATABASE [...] 我們還可以對(duì)于單個(gè)cd(′/JDBCConnectionPools/MyPool′)命令深入到這個(gè)地步。WLST永遠(yuǎn)記得cmo(當(dāng)前管理對(duì) 象,Current Managed Object),即與我們正在瀏覽的當(dāng)前“文件夾”相關(guān)的Mbean。因此,從實(shí)際角度來看這些命令是相當(dāng)?shù)模?/p> wls:/mydomain/config/JDBCConnectionPools/MyPool> cmo 現(xiàn)在,讓我們改變一些隨機(jī)屬性(參見清單6)。記住Python沒有布爾屬性。服務(wù)器可返回真或假(既然它運(yùn)行Java),但是不能賦這些值。然而,不用擔(dān)心;如果通過WebLogic控制臺(tái)查看它,布爾值1得到了服務(wù)器的正確解釋。 清單 6 wls:/mydomain/config/JDBCConnectionPools/MyPool> set?(′TestFrequencySeconds′, 500) wls:/mydomain/config/JDBCConnectionPools/MyPool> set(′TestConnectionsOnRelease′, 1) wls:/mydomain/config/JDBCConnectionPools/MyPool> ls() -rw-TestConnectionsOnCreatetrue -rw-TestConnectionsOnRelease1 -rw-TestConnectionsOnReservefalse -rw-TestFrequencySeconds500 -rw-TestStatementTimeout-1 -rw-TestTableNameSQL SELECT 1 FROM DUAL -r-- TypeJDBCConnectionPool -rw-URLjdbc:oracle:?thin::1521:DATABASE [...] wls:/mydomain/config/JDBCConnectionPools/MyPool> get(′TestConnectionsOn?Release′) 1 使用前一節(jié)關(guān)于“使服務(wù)器配置自動(dòng)化”中介紹的相當(dāng)技術(shù),也可能得到了同樣的結(jié)果。我發(fā)現(xiàn)這個(gè)方法對(duì)于系統(tǒng)管理員更簡(jiǎn)單,而第一個(gè)方法對(duì)于開發(fā)人員準(zhǔn)備 腳本則更簡(jiǎn)單。這只是適應(yīng)不同類型的工具集:系統(tǒng)管理員更習(xí)慣于Unix Shell,而開發(fā)人員對(duì)于的Java的“味道”則感覺更為舒服。 管理服務(wù)器配置的例子:一個(gè)真實(shí)例子 需要了解那些煩人的JDBC調(diào)用內(nèi)部是一種常見現(xiàn)象。有時(shí)人們真的希望能夠看見WebLogic服務(wù)器和數(shù)據(jù)庫之間對(duì)話,為什么它會(huì)見鬼地返回0行,或者輪廓性能,OK。用熱插拔功能記錄JDBC調(diào)用(而不僅是SQL,拜托了,還要記錄參數(shù))應(yīng)該不錯(cuò)。想試一下嗎? 首先,讓我們下載p6spy JDBC驅(qū)動(dòng)程序。它是一個(gè)JDBC包,可以記錄任何經(jīng)過它的東西。要配置它,將p6spy.jar和包含p6spy.properties的目錄放到服 務(wù)器classpath目錄下(不要忘了這個(gè)目錄,否則WebLogic會(huì)報(bào)告JAR文件不存在)。按照需要調(diào)整p6spy.properties。 我們想要到達(dá)的目的是創(chuàng)建兩個(gè)Connection Pool(連接池),一個(gè)直接用Oracle JDBC驅(qū)動(dòng)程序而另一個(gè)通過p6spy。然后,我們將修改數(shù)據(jù)源指向p6spy數(shù)據(jù)源而不重啟服務(wù)器(如果我們相信Web控制臺(tái)接口,這個(gè)修改無需重啟)。 我們將通過執(zhí)行之前開發(fā)出的管理腳本來開始: wls:/(offline)> execfile(′AdminTool.py′) Connecting to weblogic server instance running at t3://127.0.0.1:7001 as 成功連接到屬于“mydomain”域的Admin服務(wù)器“myserver”,它也是系統(tǒng)輸出并且應(yīng)正確格式化。 我們現(xiàn)在可以創(chuàng)建連接池了。 wls:/mydomain/config> admin.createPool("P6SPY Connection Pool", 在WebLogic控制臺(tái)我們可看到以下顯示(WebLogic日志行將只在將“debug to console”選項(xiàng)啟用時(shí)才會(huì)顯示): <28-feb-2005 20H18′ GMT> <Info> <JDBC> <BEA-001132> 這顯示連接池初始化以及新連接測(cè)試。我們將假設(shè)數(shù)據(jù)源還不存在。如果我們還清楚,應(yīng)該已經(jīng)預(yù)見到這一點(diǎn)并在AdminTool類創(chuàng)建了方法,但是,我們還是可通過清單7中所列的交互式shell來這么做。 清單 7 wls:/mydomain/config> datasource=create(′MyDS′, ′JDBCTxDataSource′) JDBCTxDataSource with name ′MyDS′ has been created successfully. wls:/mydomain/config> datasource.setJNDIName("MyDS") wls:/mydomain/config> datasource.setPoolName("P6SPY Connection Pool") wls:/mydomain/config> datasource.setEnableTwoPhaseCommit(true) wls:/mydomain/config> datasource.addTarget(admin.myServer) 1 我們已經(jīng)開始將數(shù)據(jù)源指向P6SPY連接池,因此,可以檢查應(yīng)用程序看看它真的記錄了JDBC語句;用測(cè)試案例來嘗試?,F(xiàn)在,有兩個(gè)方法可以禁止記錄。既然在Jython變量中有數(shù)據(jù)源,我們就可以用“Java”的方式來做。 datasource.setPoolName(MY_POOL_NAME) 或者,采用如清單8所示的“system administrator”方法: 清單8 wls:/mydomain/config> cd (′JDBCTxDataSources′) wls:/mydomain/config/JDBCTxDataSources> ls() drw-MyDS wls:/mydomain/config/JDBCTxDataSources> cd(′MyDS′) wls:/mydomain/config/JDBCTxDataSources/MyDS> ls() [...] -rw-PoolNameMyPool [...] wls:/mydomain/config/JDBCTxDataSources/MyDS> set(′PoolName′, MY_POOL_?NAME) 結(jié)束語 WLST是一個(gè)能夠推進(jìn)應(yīng)用程序服務(wù)器配置和遠(yuǎn)程維護(hù)的杰出工具。它還不支持用通配符查找/定位選項(xiàng)(對(duì)于一些并非不常見的情況,如有人需要查找某個(gè)配置選項(xiàng)但是想不起它的位置)。但是,當(dāng)最后與WebLogic 9綁定后,它肯定會(huì)非常有用。 |
|