天天看點

JBoss 系列九十八:JBoss MSC - 淺析 ServiceContainer

servicecontainer 接口類圖如下所示:

JBoss 系列九十八:JBoss MSC - 淺析 ServiceContainer

如圖:

servicecontainer - servicecontainer 即是 jboss msc 的抽象,它抽象的是一個子產品化的容器,它設計用來管理一系列服務

servicetarget - 提供了添加服務,添加依賴等方法,另外這些添加隻有在servicebuilder 的 install() 方法後才生效

serviceregistry - 服務注冊接口,可根據服務名擷取一個服務,或擷取所有服務名清單

另外,servicecontainer 包含一個工廠類,用來建立 servicecontainer,工廠類中 create() 方法如下:

注意,這些create() 方法中的參數是用于執行個體化servicecontainer時建立threadpoolexecutor。

servicecontainer 接口的實作類 servicecontainerimpl 中有一個 containerexecutor 屬性,其中在執行個體化servicecontainerimpl被初始化,containerexecutor 實作了 threadpoolexecutor 且使用如下構造方法:

如上使用一些初始化參數建構 threadpoolexecutor:

corepoolsize - 線程池中儲存的線程數,不管線程是否空閑,當線程數大小小于 corepoolsize 就建立線程,并處理請求

maximumpoolsize - 線程池允許的最大線程數

keepalivetime - 當線程池中線程數大于 corepoolsize 時,多餘的線程在等待空閑時間 keepalivetime 後終止

unit - keepalivetime 的時間機關

workqueue - task 被執行之前首先至于此 workqueue,當然 workqueue 隻儲存實作 runnable 的 task,通常被 execute 方法送出

threadfactory - 用來建立建立新線程

handler - 當隊列裡累積的 task 多于 workqueue 最大容量時用來處理新來的 task

jboss msc containerexecutor 構造方法如下:

如上,workqueue 沒有定義容量限制,工作線程命名規則 msc service thread %d-%d,是以我們在 中可以看到線程所謂名字如msc service thread 1-1。

jboss msc containerexecutor 的啟動是servicebuilder 的 install 方法,使的 servicecontainerimpl 的 doexecute 方法中執行,此方法完成容器初始化:

如 中的示例,我們隻啟動一個服務,但是示例執行完成後容器中有8個線程,這是因為我們初始化的 corepoolsize 為 8,當線程數小于 corepoolsize 就建立線程,并處理請求。

// coming soon