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

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

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

    JBoss的部署機制

    Posted on 2009-06-06 09:03 thui 閱讀(2859) 評論(3)  編輯  收藏 所屬分類: java技術
    JBoss 的部署架構可以分為三個部分:熱部署機制、部署的通用流程、部署的過程。
    熱部署機制,使得我們在不需要重啟JBoss的情況下,可以增加、修改和刪除部署單元。JBoss會在運行時“察覺”到這些變化,并做出相應的處理。
    部署的通用流程,是一個對不同類型的部署單元都適用的部署過程。JBoss支持多種部署單元,包括jar格式的EJB組件、war格式的Web組件、ear格式的企業應用組件、sar格式的服務組件、har格式的hibernate應用等等。不同類型組件的部署過程是不同,但從宏觀的角度看,它們還有一個通用的流程。
    部署的過程,就是每種類型組件自己獨特的部署操作。每種類型的組件都由一個特定的子部署器來完成部署過程。子部署器都是org.jboss.deployment.SubDeployer的子類。
    部署單元可以是一個壓縮包,也可能一個目錄。JBoss使用DeploymentInfo對象來封裝部署單元的相關信息,在部署的過程,對DeploymentInfo對象進行操作。
    在這篇文章中,我將介紹熱部署機制和部署的通用流程。由于可部署組件的類型太多,我就不一一介紹每種組件部署的過程。
    首先,我先介紹部署的通用流程。
    每種組件的部署都有三個階段,依次是init、create和start。這三個階段構成了部署的通用流程。整個流程由org.jboss.deployment.MainDeployer負責管理。MainDeployer作為一個MBean,在JBoss啟動時被創建。部署一個組件,從調用MainDeploy的deploy方法開始。Deploy首先會調用MainDeploy的init方法,進入init階段。如果這一階段執行成功,則接著調用MainDeploy的create方法,進入create階段。如果這一階段也執行成功,則調用MainDeploy的start方法,進入start階段。如果這一階段也執行成功,那么整個部署就成功了。現在讓我們看看MainDeploy在每個階段都做了什么事情。
    Init階段:
    首先,MainDeployer需要判斷部署單元是否要被解壓縮和拷貝到臨時目錄。一般來說,部署單元是被方法${JBOSS_HOME}/server/default/deploy目錄下。如果部署單元是一個目錄,那么就直接部署。如果部署單元是一個壓縮包,就需要將它解壓到${JBOSS_HOME}/server/default/tmp/deploy。解壓縮是可以理解的,為什么需要拷貝到臨時目錄呢?如果直接解壓縮到deploy目錄,那么JBoss就會將解壓后的目錄視為一個新的部署單元。這樣,一個部署單元被部署兩次,這是不可以的。
    然后,MainDeployer將為部署單元查找能夠部署它的SubDeployer。例如,MainDeployer會為EJB組件找到EJBDeployer。所有的SubDeployer同MainDeployer一樣,都是在JBoss啟動時創建的。而且,每個SubDeployer都被注冊到MainDeployer中,這樣MainDeloyer就能找到它們。那么,MainDeployer是如何查找的呢?每種SubDeployer都會實現一個accepts方法,這個方法接收DeploymentInfo對象作為參數,并判斷自己能不能部署它。如果能,返回true,否則返回false。MainDeployer就依次調用每個SubDeployer的accepts方法,MainDeplpyer將第一個返回true的SubDeployer,作為部署單元的SubDeployer。
    接著,MainDeployer將部署單元添加到部署等待隊列中。這個隊列的作用是,如果某個部署單元因為依賴關系不滿足,而不能被部署,則將它暫存起來。但依賴關系滿足時,MainDeployer就可以從等待隊列中將它取出,并重新部署。
    再接著,MainDeployer將調用部署單元的SubDeployer的init方法,進行特定于組件類型的初始化工作。
    接著,MainDeployer為部署單元創建一個統一類加載器UCL,這個與JBoss的類加載器架構有關。
    再接著,MainDeployer讀取MANIFEST.MF文件,如果有引用的jar,將它們作為子部署單元,添加到部署單元中。
    最后,調用MainDeployer.init方法(這是一個遞歸的過程),初始化所有的子部署單元。
    Create階段:
    首先,調用MainDeployer.create方法,創建所有的子部署單元。然后,調用部署單元的SubDepoyer的create方法(這是一個遞歸的過程),進行特定于組件類型的創建工作。
    Start階段:
    首先,調用MainDeployer.start方法,啟動所有的子部署單元。然后,調用部署單元的SubDeployer的start方法(這是一個遞歸的過程),進行特定于組件類型的啟動工作。最后,檢查部署單元關聯的所有MBean是不是都已經啟動。如果沒有的話,整個部署就失敗了。

    下面,我再介紹一下熱部署機制。熱部署機制的實現是很比較復雜的,有很多技術問題需要解決。但是它的結構是很簡單的。所有需要熱部署的部署單元都方法deploy目錄下,有一個專門監視該目錄的線程,它定期掃描目錄下的部署單元。如果有新的部署單元被添加進來,或者某個部署單元被刪除掉,該線程就會通知MainDeloyer部署或銷毀該部署單元。如果某個部署單元被修改,該線程就會通知MainDeployer充新部署該部署單元。該線程是通過文件的修改時間,來判斷某個部署單元是否被修改。org.jboss.deployment.scanner.URLDeploymentScanner負責熱部署的執行。它作為一個MBean,在JBoss啟動時被創建。JBoss啟動時,會調用它的createService方法。該方法又會其父類AbstractDeploymentScanner的createService方法。其父親的createService方法會創建一個ScannerThread線程,這個線程每隔一段時間就會調用URLDeploymentScanner的scan方法。scan方法的工作就是檢查deploy目錄下的變化,并調用MainDeployer的相應方法來進行重新部署、銷毀等操作。

    Feedback

    # re: JBoss的部署機制[未登錄]  回復  更多評論   

    2009-08-04 10:47 by phoenix
    受用了,得益非淺
    請允許我收藏到我的空間里

    # re: JBoss的部署機制  回復  更多評論   

    2013-06-05 09:57 by nju叮當
    收藏,寫的很詳細

    # re: JBoss的部署機制[未登錄]  回復  更多評論   

    2014-12-30 13:39 by 小龍
    熱部署 項目里有JBPM 和 定時任務 添加新文件就報錯

    posts - 11, comments - 8, trackbacks - 0, articles - 4

    Copyright © thui

    主站蜘蛛池模板: 一区二区三区四区免费视频| jizz免费在线观看| 国产成人亚洲综合无| 免费无毒a网站在线观看| a视频免费在线观看| 91热成人精品国产免费| 在线免费观看一级片| 亚洲精品视频在线观看你懂的| 国产亚洲一区二区精品| 亚洲一区精品视频在线| 精品免费AV一区二区三区| 国产视频精品免费视频| 18未年禁止免费观看| 真实乱视频国产免费观看| 狠狠色婷婷狠狠狠亚洲综合| 亚洲成AV人片在线观看ww| 亚洲中文字幕久在线| 一级特黄aaa大片免费看| 99久久免费中文字幕精品| 大学生一级特黄的免费大片视频| 国产国拍亚洲精品福利| 亚洲成人网在线观看| 爱情岛论坛免费视频| 在线成人爽a毛片免费软件| 免费理论片51人人看电影| 亚洲精品乱码久久久久久自慰| 亚洲国产美女精品久久久久| 男人j进女人p免费视频| 91福利免费视频| 亚洲AV成人潮喷综合网| 亚洲精品国产成人| 成年网在线观看免费观看网址| 131美女爱做免费毛片| 亚洲精品国产va在线观看蜜芽| 亚洲成年人电影网站| 国产乱妇高清无乱码免费| 91在线视频免费91| 久久亚洲综合色一区二区三区| 亚洲国产精品日韩av不卡在线| 久久免费观看国产精品88av| 国产hs免费高清在线观看|