天天看点

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