<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    新的起點(diǎn) 新的開(kāi)始

    快樂(lè)生活 !

    JBoss用戶(hù)指南-關(guān)于ClassLoader(互聯(lián)網(wǎng))

            由于JMX的天生麗質(zhì),適合作為一個(gè)大型應(yīng)用程序的框架/平臺(tái),JBoss便成為其實(shí)驗(yàn)品中之一。利用JMX作為應(yīng)用程序 框架的好處至少在于:1)所有(核心的和非核心的)component和service都可以hot instrumentation到JMX Server上,作為相對(duì)獨(dú)立的MBean,JMX Server本身作為一個(gè)獨(dú)立于各組件與服務(wù)的“總線(xiàn)”,并有MBean之間的Notification的機(jī)制——服務(wù)器平臺(tái)是Scalable的。2) 由于JMX所聲稱(chēng)的優(yōu)點(diǎn),它的Distribute Tier可以支持RMI、HTTP等等多種客戶(hù)端(以后還包括WS乃至更多),客戶(hù)端也是Scalable的。3)各組件與服務(wù)作為MBean,其狀態(tài)與 行為都可以通過(guò)MBean的操作在運(yùn)行時(shí)控制,這樣的Server無(wú)疑具有很好的Usablity。

    類(lèi)裝載器

    Java中的Class實(shí)例,不僅是全限定名(包名+類(lèi)名)的函數(shù),也是類(lèi)裝載器的函數(shù),即:
    :Class = f(name, Li, Ld)
    其中,name表示類(lèi)名,Li為初始裝載器,Ld表示定義裝載器。
    初 始裝載器為在其上發(fā)生loadClass調(diào)用返回Class實(shí)例的那個(gè)裝載器;定義裝載器則是實(shí)際為Class實(shí)例執(zhí)行defineClass,從 bytecode中讀入類(lèi)定義的那個(gè)裝載器。因?yàn)閘oadClass方法可以被子類(lèi)重載,其中對(duì)defineClass的調(diào)用有可能被delegate給 其它裝載器做,所以L(fǎng)i和Ld不一定相同。

    于是,
    1. 兩個(gè)不同類(lèi)裝載器裝載的類(lèi),即使類(lèi)全限定名相同,都不能相互cast,否則拋出ClassCastException。
    2. 如果裝載器L1裝載的類(lèi)p.A有包可見(jiàn)的方法f,則裝載器L2裝載的類(lèi)p.B不能訪(fǎng)問(wèn)f,否則拋出IllegalAccessException。
    3. 如果有Class1和Class2的name,Li相同,而Ld不同,它們實(shí)例之間的引用賦值時(shí)會(huì)觸發(fā)裝載限制檢查,拋出LinkageError。


       為了熱deploy模塊的需要,JBoss實(shí)現(xiàn)了自己的類(lèi)裝載器UnifiedClassLoader3,一般來(lái)說(shuō),一個(gè)頂層的deployment就有一個(gè)UnifiedClassLoader3實(shí)例為之工作。JBoss所裝載的類(lèi)呈平面模型——也就是說(shuō),一個(gè)deployment所裝載的類(lèi),其他 deployment是可見(jiàn)的。全局唯一的UnifiedLoaderRepository3實(shí)例用于管理這些類(lèi),以及裝載它們的UnifiedClassLoader3。UnifiedLoaderRepository3實(shí)例和UnifiedClassLoader3實(shí)例是一對(duì)多的關(guān)系。
       一個(gè)deployment要裝載一個(gè)類(lèi),
    1)先查看全局的
    UnifiedLoaderRepository3實(shí)例里的cache是否已存在,存在則返回。
    2)否則,用deployment自己的UnifiedClassLoader3裝載,成功則更新UnifiedLoaderRepository3的cache,并返回。
    3)否則用UnifiedLoaderRepository3里的其他UnifiedClassLoader3裝載,成功則更新UnifiedLoaderRepository3的cache,并返回。
    4)否則拋出ClassNotFoundException。

      
       要查看默認(rèn)的全局唯一的UnifiedLoaderRepository3里裝載Class的情況,見(jiàn)名為JMImplementation:name=Default,service=LoaderRepository的MBean。它有displayClassInfo(String)的方法,用于查看有關(guān)Class的ClassLoader;還有getPackageClassLoaders(String)方法,用于得到“哪些ClassLoader有裝載某個(gè)package的能力”。

       JBoss的平面類(lèi)裝載機(jī)制決定了,一般情況下,相同類(lèi)名的類(lèi)在整個(gè)JBoss運(yùn)行環(huán)境中,只裝載一次。如果要不同的EAR包中,有不同版本的a.b.C類(lèi),需要為EAR指定自己的
    HeirarchicalLoaderRepository3,先和這個(gè)Repository一起工作找到自己版本的C類(lèi)而不是到全局的UnifiedLoaderRepository3里去找全局的版本。這個(gè)機(jī)制叫做Scoping Classes——即EAR有自己獨(dú)立的類(lèi)裝載空間。要配置Scoping Class,需要在META-INF/jboss-app.xml描述符里注明:

    <jboss-app>

    <loader-repository>some.dot.com:loader=webtest.ear</loader-repository>

    </jboss-app>
       其中,MBean名稱(chēng)(粗體部分)可以是符合MBean名稱(chēng)規(guī)范的隨意名稱(chēng)。


      說(shuō)明:
    1)Server Loader是一個(gè)NoAnnotationURLClassLoader的實(shí)例(見(jiàn)ServerLoad.load方法),它控制的URL有$ JBOSS_HOME/lib下的jboss-jmx.jar、concurrent.jar、log4j-boot.jar、jboss- common.jar、jboss-system.jar、jboss-xml-binding.jar、namespace.jar以及其他用命令行參 數(shù)指定的jar包。它負(fù)責(zé)load的類(lèi)包括org.jboss.system.server.ServerImpl、 org.jboss.mx.server.MBeanServerImpl、UnifiedLoaderRepository3等等。
    2)全局唯 一的UnifiedLoaderRepository3實(shí)例是實(shí)現(xiàn)JBoss平面類(lèi)裝載模型的關(guān)鍵。這個(gè)實(shí)例是標(biāo)準(zhǔn)的 javax.management.MBeanServer的成員,可以用標(biāo)準(zhǔn)的方法: MBeanServer.getClassLoaderRepository()得到。
    3)ServerTCL是一個(gè) UnifiedClassLoader3的實(shí)例,它控制的URL是server/<config>/conf(用于有關(guān)resources的 裝載)。它負(fù)責(zé)ServerInfo、ServiceController、MainDeployer、JARDeployer、SARDeployer 等MBean的類(lèi)裝載和實(shí)例化,在這幾個(gè)MBean的創(chuàng)建和start的上下文中,它作為當(dāng)前線(xiàn)程ContextClassLoader。

    實(shí)現(xiàn)自定義service

       JBoss平臺(tái)沒(méi)有在它之上實(shí)現(xiàn)service規(guī)定了諸多限制,相反,它為MBean的部署和訪(fǎng)問(wèn)提供了許多方便:Service可以在不重啟動(dòng) JBoss平臺(tái)的情況下,被熱部署或者熱刪除;Service不必?fù)?dān)心它引用的jar包如何到位,將這些jar包放在合理的位置,它們就直接能被部署器找 到了;如果service需要較好的生命周期管理,或引用其他service,對(duì)JBoss平臺(tái)的依賴(lài)才派上用場(chǎng)。

       一個(gè)部署到JBoss的service可以是放置在$JBOSS_HOME/server/<config>/deploy目錄下的一個(gè) *.sar包,一個(gè)*.sar文件夾,或者由*-service.xml描述,或者是其他的形式。一個(gè)service經(jīng)由xml文件描述可以暴露多個(gè) mbean。

       一個(gè)部署到JBoss的service可以是不依賴(lài)于JBoss平臺(tái)的任何符合JMX規(guī)范的mbean,也可以是一個(gè)借用JBoss Service的生命周期管理和依賴(lài)管理的一個(gè)MBean,也可以是利用JBoss XMBean描述規(guī)范將普通的Java對(duì)象“升級(jí)”而出的一個(gè)mbean:
    1)mbean可以沒(méi)有對(duì)JBoss的任何依賴(lài)。以standard mbean為例,三個(gè)文件就足夠提供一個(gè)service:org.abc.HelloMBean接口,實(shí)現(xiàn)該接口的org.abc.Hello類(lèi),以及一 個(gè)service描述文件——該描述文件可以是sar包或目錄內(nèi)的META-INF/jboss-service.xml,也可以是一個(gè)單獨(dú)作為部署單位 的文件,如直接在deploy目錄(或其子目錄)下的hello-service.xml。
    2)如果用戶(hù)定義的mbean需要生命周期的管理,它 可以實(shí)現(xiàn)org.jboss.system.ServiceMBean接口及其create,start,stop,destroy等生命周期方法,或者 干脆擴(kuò)展org.jboss.system.ServiceMBeanSupport類(lèi)。
    3)開(kāi)發(fā)者可以在service描述文件里說(shuō)明本 mbean對(duì)其他mbean的依賴(lài)。所謂“依賴(lài)”是指,本mbean在create/start時(shí)先檢查被依賴(lài)的mbean是否已經(jīng)存在/啟動(dòng),否則調(diào)用 它的create/start方法;一個(gè)被依賴(lài)的mbean被stop/destroy時(shí),依賴(lài)于它的mbean首先被調(diào)用stop/destroy方 法。
    4)除了基于JMX標(biāo)準(zhǔn)的mbean實(shí)現(xiàn)方案,JBoss還支持用一個(gè)xml文件描述的方式將普通的Java對(duì)象開(kāi)放為一個(gè)mbean,即 XMBean。在service描述文件里可以用xmbean-dd屬性指明一個(gè)外部的XMBean定義,或者將xmbean-dd屬性賦值為"",在 mbean標(biāo)簽中內(nèi)嵌xmbean的內(nèi)容說(shuō)明。XMBean的優(yōu)勢(shì)在于a)不需要目標(biāo)Java對(duì)象實(shí)現(xiàn)任何JMX有關(guān)的接口;b)相對(duì)Standard MBean可以在xmbean-dd的xml內(nèi)提供豐富的元數(shù)據(jù)描述信息。

       理論上,放置在$JBOSS_HOME/server/<config> /deploy(包括子目錄)下的所有jar包都會(huì)被URLDeploymentScanner監(jiān)控,為其他的service所用。這些jar包也是可動(dòng) 態(tài)添加的。實(shí)際上,我們吧my-service.xml和my-service.jar(假設(shè)my-service.xml描述的mbean的類(lèi)定義在 my-service.jar內(nèi))放置在deploy目錄下,然后啟動(dòng)JBoss,my-service是不能成功啟動(dòng)的,因?yàn)镴Boss的 MainDeployer部署包有一個(gè)順序,基本上是.deployer>deployer.xml>.sar>.rar> ds.xml>service.xml>.har>.jar>.war>.wsr>.ear>.zip>. bsh>.last,可見(jiàn)my-service.xml是在my-service.jar之前得到部署的,自然引用不到my- service.jar之內(nèi)的類(lèi)了。

       如果將jar放在sar(目錄或包)內(nèi)的任一層子目錄內(nèi),sar對(duì)應(yīng)的service引用這些jar是沒(méi)有問(wèn)題的,因?yàn)閟ar相關(guān)的部署器做了“深度優(yōu)先”的部署——先部署這些jar包,然后部署sar。

       因?yàn)閁nifiedLoaderRepository所決定的平面類(lèi)裝載模型,在一個(gè)sar內(nèi)引用(部署)成功了a.jar,其他大部分service也可以使用a.jar了。

       *-service.xml里的server標(biāo)簽有一個(gè)classpath的子標(biāo)簽,用來(lái)指定sar的外部類(lèi)路徑。classpath標(biāo)簽的 codebase屬性默認(rèn)是以$JBOSS_HOME/server/<config>為根的,archives屬性的值可以是一個(gè)或多個(gè)逗 號(hào)格開(kāi)的jar文件名(注意只能是一層文件名)

    posted on 2008-07-23 12:37 advincenting 閱讀(1186) 評(píng)論(0)  編輯  收藏 所屬分類(lèi): 服務(wù)器 比如:WebLogic(Develop+Deploy)

    公告

    Locations of visitors to this pageBlogJava
  • 首頁(yè)
  • 新隨筆
  • 聯(lián)系
  • 聚合
  • 管理
  • <2008年7月>
    293012345
    6789101112
    13141516171819
    20212223242526
    272829303112
    3456789

    統(tǒng)計(jì)

    常用鏈接

    留言簿(13)

    隨筆分類(lèi)(71)

    隨筆檔案(179)

    文章檔案(13)

    新聞分類(lèi)

    IT人的英語(yǔ)學(xué)習(xí)網(wǎng)站

    JAVA站點(diǎn)

    優(yōu)秀個(gè)人博客鏈接

    官網(wǎng)學(xué)習(xí)站點(diǎn)

    生活工作站點(diǎn)

    最新隨筆

    搜索

    積分與排名

    最新評(píng)論

    閱讀排行榜

    評(píng)論排行榜

    主站蜘蛛池模板: 美女被cao网站免费看在线看| 中文字幕乱码亚洲精品一区| 一个人看的在线免费视频| 国产高清免费观看| 亚洲大尺度无码无码专线一区| 在线观看免费高清视频| 亚洲成人网在线观看| 91视频国产免费| 亚洲精品国产高清在线观看| 免费的涩涩视频在线播放| 美女黄色毛片免费看| 国产亚洲欧洲Aⅴ综合一区| 丝袜足液精子免费视频| 国产成人亚洲综合色影视| 国产高清不卡免费视频| 亚洲欧洲精品视频在线观看| 欧美大尺寸SUV免费| 看亚洲a级一级毛片| 亚洲香蕉成人AV网站在线观看| 久久久精品免费视频| 亚洲视频在线观看地址| 我要看WWW免费看插插视频| 国产精品亚洲lv粉色| 中文字幕精品亚洲无线码一区应用| 在线观看片免费人成视频播放| 2022年亚洲午夜一区二区福利| 最近免费中文字幕大全| 成人福利在线观看免费视频| 亚洲av无码国产精品色午夜字幕| 在线人成精品免费视频| 鲁死你资源站亚洲av| 亚洲婷婷五月综合狠狠爱| 在线天堂免费观看.WWW| 高潮毛片无遮挡高清免费| 亚洲五月六月丁香激情| 永久在线毛片免费观看| 色www永久免费网站| 亚洲精品av无码喷奶水糖心| 亚洲精品无码不卡在线播HE | 5555在线播放免费播放| 亚洲国产无线乱码在线观看|