<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

    主站蜘蛛池模板: 亚洲码和欧洲码一码二码三码 | 国产乱子伦精品免费无码专区| 麻豆亚洲av熟女国产一区二| 久久成人免费电影| 亚洲国产精品无码久久一线| 97国免费在线视频| 亚洲伦理一区二区| 国产91免费在线观看| 2020久久精品亚洲热综合一本| 嫩草影院免费观看| 黄网站色视频免费观看45分钟| 免费在线观看你懂的| 国产成人无码精品久久久久免费| 日本亚洲成高清一区二区三区| 插鸡网站在线播放免费观看| 亚洲国产精品线在线观看| 在线看片韩国免费人成视频| 国产亚洲一卡2卡3卡4卡新区 | 亚洲国产一区二区视频网站| 中文字幕不卡免费高清视频| 久久精品国产亚洲av影院| 噼里啪啦电影在线观看免费高清| 亚洲欧美日韩一区二区三区 | 久久久久亚洲AV无码专区桃色| 青柠影视在线观看免费高清| 亚洲国产成人久久| 免费一区二区视频| 东方aⅴ免费观看久久av| 亚洲人成高清在线播放| 免费h成人黄漫画嘿咻破解版| 最近免费中文字幕MV在线视频3| 亚洲一级毛片在线播放| 亚洲AV无码乱码精品国产| 日本高清免费观看| 亚洲精品无码高潮喷水A片软| 亚洲午夜久久久久久久久久| 30岁的女人韩剧免费观看| 美国免费高清一级毛片| 亚洲丝袜美腿视频| 亚洲国产电影av在线网址| 狼群影院在线观看免费观看直播|