在BEA WebLogic Server上開(kāi)發(fā)應(yīng)用程序的20條技巧(來(lái)源于網(wǎng)絡(luò))
在BEA WebLogic Server上開(kāi)發(fā)應(yīng)用程序的20條技巧
Q: 引起NoClassDefFoundError的原因?
A: J2EE容器中引發(fā)NoClassDefFoundErrors最常見(jiàn)的原因是父類(lèi)加載器使用了只在子類(lèi)加載器中有效的類(lèi);例如,一個(gè)在$CLASSPATH中的擴(kuò)展類(lèi)只能在子類(lèi)加載器中有效。幻燈片里還有深入的調(diào)試技巧。
Q:如果在你的system/lib文件夾和WAR里同時(shí)都有一個(gè)jar包,那么哪一個(gè)具有較高的優(yōu)先級(jí)?
A:默認(rèn)的情況下,Java類(lèi)加載器是“parent-first”,是指它會(huì)首先請(qǐng)求它的父加載器來(lái)加載,只有在父加載器無(wú)法加載的時(shí)候才試圖自己加載。因此如果$CLASSPATH中有這個(gè)類(lèi),那么它將是應(yīng)用類(lèi)加載器的首選。
WebLogic
Server的weblogic.xml中有一個(gè)選項(xiàng)prefer-web-inf-classes,可以將war中類(lèi)庫(kù)設(shè)置成優(yōu)先加載。必須要小心的設(shè)
置這個(gè)選項(xiàng)。一旦設(shè)置了這個(gè),會(huì)很容易導(dǎo)致ClassCastExceptions和其它無(wú)法預(yù)測(cè)的類(lèi)加載問(wèn)題
Q:當(dāng)線程池里的線程被分配到不同應(yīng)用的進(jìn)程時(shí),它們是怎樣取的不同類(lèi)加載器層次的?
A: WebLogic Server在應(yīng)用程序部署的時(shí)候創(chuàng)建類(lèi)加載器。當(dāng)容器在響應(yīng)請(qǐng)求的時(shí)候,它需要保證這個(gè)請(qǐng)求被分發(fā)到了正確的應(yīng)用程序類(lèi)加載器。
Q:在調(diào)試的時(shí)候能夠設(shè)置端點(diǎn)嗎?
A: 是的!BEA WebLogic Workshop是一個(gè)支持端點(diǎn)的Java調(diào)試器。其它支持端點(diǎn)的Java調(diào)試器或IDE也能夠正常的運(yùn)行。
Q: APP-INF是標(biāo)準(zhǔn)J2EE的一部分,還是WebLogic Server的特性?
A: APP-INF是一個(gè)由BEA增加的特性,目前還沒(méi)有添加到J2EE標(biāo)準(zhǔn)中。但是,將有APP-INF的應(yīng)用轉(zhuǎn)移到其它不支持APP-INF的老版本W(wǎng)LS或其它容器也是非常得容易。
你可以通過(guò)manifest class-path來(lái)將應(yīng)用轉(zhuǎn)移到其它老的WLS版本上。推薦的方式是在產(chǎn)生目標(biāo)文件的時(shí)候生成方便的ear文件。生產(chǎn)目標(biāo)文件的時(shí)候會(huì)產(chǎn)生一個(gè)manifest文件,這個(gè)文件里有對(duì)APP-INF/lib中所有jar文件的manifest class-path 索引。每一個(gè)J2EE模塊都需要這個(gè)manifest文件。
Q:哪里可以找到wlpackage/wlcompile命令?這些是命令行命令嗎?能不能在WebLogic Admin Server Console里使用?
A: wlpackage 和 wlcompile都是ant任務(wù)。Ant的執(zhí)行程序在weblogic.jar 中。同WebLogic platform打包在一起的ant 有一個(gè)屬性文件,這個(gè)文件包含了所以事先定義好的BEA taskdefs。
如果你使用的是不同版本的ant,你需要手工來(lái)使用這些taskdefs。以下是一些在BEA ant 屬性文件中定義的任務(wù)名稱和類(lèi)名:
ddinit=weblogic.ant.taskdefs.ejb.DDInit
wldeploy=weblogic.ant.taskdefs.management.WLDeploy
wlserver=weblogic.ant.taskdefs.management.WLServer
wlconfig=weblogic.ant.taskdefs.management.WLConfig
wlcompile=weblogic.ant.taskdefs.build.WLCompileTask
wlpackage=weblogic.ant.taskdefs.build.WLPackageTask
wlappc=weblogic.ant.taskdefs.j2ee.Appc
Q: 我需要在開(kāi)發(fā)模式中頻繁的更換Java類(lèi),在更改之后是不是要重新部署整個(gè)應(yīng)用程序?
A: 這取決于Java類(lèi)是在哪里被加載的。如果類(lèi)是在$CLASSPATH當(dāng)中,就需要重新啟動(dòng)server。如果類(lèi)是在你的應(yīng)用程序當(dāng)中,就只需要重新部署應(yīng)用。如果類(lèi)在webapp中,就只需要重新部署webapp,而不需要重新部署整個(gè)app了。
是否需要重新部署和類(lèi)加載器的結(jié)構(gòu)有關(guān),幻燈片里有一張類(lèi)加載器結(jié)構(gòu)圖。如果你改動(dòng)了父類(lèi)加載器加載的某些類(lèi),你需要重新部署由子類(lèi)加載器加載的所有東西。
Q: 在使用wlappc的時(shí)候,提示說(shuō)不認(rèn)識(shí)wlappc這個(gè)任務(wù)。是不是我缺少什么東西或步驟?
A: 請(qǐng)參考前面的問(wèn)答。你碩使用的ant和BEA打包的ant版本不一致,因此你需要為wlappc包含一個(gè)taskdef。參考如下的方式:
<taskdef name="wlappc"
classname="weblogic.ant.taskdefs.j2ee.Appc"
/>
Q: ant中有停止WebLogic cluster的任務(wù)嗎?比如<wlserver>。我需要指定停止一個(gè)cluster并重新部署。
A: wlserver任務(wù)可以用來(lái)停止server。只需要把參數(shù)action設(shè)置成“shutdown”就可以了
Q:
有些時(shí)候我們從support那里取得臨時(shí)的補(bǔ)丁(CR####.jar),在classpath中將它們放在weblogic.jar之前。但是如果
weblogic.jar在應(yīng)用程序的build classpath中,需不需要修改build文件來(lái)引用CR jar文件?
A: 是的,建議你也在build classpath中包含進(jìn)補(bǔ)丁。這些補(bǔ)丁可能修復(fù)了像weblogic.appc或weblogic.ejbc這樣的工具,它們可能會(huì)在你build工程的時(shí)候使用到。
Q: 管理和打包部署描述符(從單機(jī)開(kāi)發(fā)模式到集群產(chǎn)品模式)的最好方式是什么?
A: 問(wèn)題關(guān)鍵在于描述符里綁定的是些什么。例如,你的描述符里可能引用了http://test:7001,但是在生產(chǎn)模式下應(yīng)該是http://production:7001
我的建議是在描述符里包含一些變量,然后使用像sed、perl這樣的預(yù)處理程序來(lái)將這些變量替換成合適的值。例如,你的描述符里可能有$SERVER,用sed生成一個(gè)test描述符,這個(gè)描述符里$SERVER被替換成了test URL。
Q: 在一個(gè)WebLogic域中同時(shí)部署Workshop-enabled的應(yīng)用和non-Workshop-enabled的應(yīng)用是否可以?
A: 在同一個(gè)server或者域中運(yùn)行這兩類(lèi)應(yīng)用程序是沒(méi)有問(wèn)題的。是否在同一個(gè)WLS實(shí)例中運(yùn)行多個(gè)應(yīng)用取決于end-user的需要。分離開(kāi)應(yīng)用的話,可以取的更好的獨(dú)立性,但是需要管理多個(gè)server。
Q:協(xié)同定位(co-location)是默認(rèn)的設(shè)置還是需要在某個(gè)地方手工配置?
A:這個(gè)沒(méi)有默認(rèn)的設(shè)置。應(yīng)用都被部署到集群或者服務(wù)器上。如果將應(yīng)用程序拆分成兩部分部署到兩個(gè)地方,則是“split”;如果統(tǒng)一部署到一層,則是“co-located”。
Q: 兩個(gè)不同的WebLogic Server的license能否被同一個(gè)server使用,用來(lái)創(chuàng)建兩個(gè)使用同樣端口但環(huán)境不同的domain?
A:這個(gè)我不太清楚。關(guān)于license的問(wèn)題,你可以E-mail:support@bea.com 咨詢
Q: 我們的啟動(dòng)類(lèi)使用到了EJB,因此我需要在classpath中加入EJB的接口類(lèi),有沒(méi)有什么方法可以避免這種依賴?
A:
啟動(dòng)類(lèi)是在server啟動(dòng)的時(shí)候被調(diào)用的。部署應(yīng)用程序的時(shí)候,Application范圍的監(jiān)聽(tīng)器會(huì)收到callback。如果能夠等到部署完成,你
就可以使用ApplicationLifecycleListener或者servlet
listener了。監(jiān)聽(tīng)器里能夠使用classloader,就可以不用在classpath里面加入EJB接口類(lèi)了。
Q: WebLogic是否提供了這樣的API或機(jī)制?當(dāng)集群里最后一個(gè)機(jī)器宕機(jī)(無(wú)論是否正常情況)的時(shí)候,可以執(zhí)行一個(gè)自定義的任務(wù),這樣我們就可以做些清理工作。
A: 我不知道有這樣一種API。每個(gè)server正常關(guān)閉的時(shí)候你都會(huì)收到一個(gè)hook,而如果程序崩潰,則不會(huì)。
Q: 因?yàn)槊總€(gè)JSP文件會(huì)被一個(gè)單獨(dú)的類(lèi)加載器加載,那么訪問(wèn)JSP是不是要慢一些或者不夠memory-efficient?那對(duì)于Servlet呢?使用的是哪一個(gè)類(lèi)加載器?
A: 一個(gè)webapp中的所有servlet都是被一個(gè)普通的類(lèi)加載器加載的。JSP是有一個(gè)單獨(dú)的類(lèi)加載器加載,它的父加載器是webapp的加載器。
WLS經(jīng)過(guò)了非常廣泛/嚴(yán)格?(extensively)的性能測(cè)試,這種JSP/類(lèi)加載器模式并不是性能上的障礙。這種模式對(duì)內(nèi)存的額外開(kāi)銷(xiāo)相對(duì)比較小。
Q: 如果我有一個(gè)ear文件,里邊有war和EJB jars,在改動(dòng)JSP的時(shí)候是否需要重新生成ear?如果是的話,那是否意味著會(huì)給webapp和jsp重新創(chuàng)建一個(gè)類(lèi)加載器?
A: 如我這次談話中說(shuō)到的,我不推薦在開(kāi)發(fā)過(guò)程中打包成EAR。如果你是在開(kāi)發(fā)中部署的目錄,只需要編輯好JSP之后在瀏覽器中點(diǎn)擊“reload”。
Q: 目錄是否不適合部署在產(chǎn)品模式下?
A: 目錄部署只在單機(jī)的開(kāi)發(fā)模式下支持。Wlpackage任務(wù)可以用來(lái)將應(yīng)用程序打包成標(biāo)準(zhǔn)的EAR。
Q: 關(guān)于在WebLogic集群環(huán)境下的開(kāi)發(fā),您還有些其它的建議嗎?
A: 通常我建議每一個(gè)開(kāi)發(fā)人員都使用他自己的WLS實(shí)例。相比共享的環(huán)境我更加喜歡這種方式。測(cè)試應(yīng)該在集群環(huán)境進(jìn)行,但是開(kāi)發(fā)人員可以使用單機(jī)來(lái)進(jìn)行開(kāi)發(fā)。
Q: 如果Beans是遠(yuǎn)程的,“co-location”時(shí)WLS是否會(huì)不做marshalling 和unmarshalling?
A: 使用本地接口的EJB是call-by-reference(如同標(biāo)準(zhǔn)的java 調(diào)用)。采用遠(yuǎn)程接口的EJB默認(rèn)是call-by-value。
當(dāng)遠(yuǎn)程的調(diào)用者和被調(diào)用者都在同一個(gè)WLS實(shí)例中時(shí),遠(yuǎn)程調(diào)用會(huì)經(jīng)過(guò)一個(gè)優(yōu)化的RMI棧。這過(guò)程中不會(huì)打開(kāi)套接字,同時(shí)RMI棧會(huì)避免在java.lang.String 這樣的immutable類(lèi)型上做 marshalling/unmarshalling。對(duì)于Mutable類(lèi)型,Java序列化會(huì)發(fā)生。
posted on 2008-07-23 10:13 advincenting 閱讀(698) 評(píng)論(0) 編輯 收藏 所屬分類(lèi): 服務(wù)器 比如:WebLogic(Develop+Deploy)