首页 > 代码库 > JBoss 系列九十八:JBoss MSC - 浅析 ServiceContainer
JBoss 系列九十八:JBoss MSC - 浅析 ServiceContainer
ServiceContainer 接口类图
ServiceContainer 接口类图如下所示:
如图:
- ServiceContainer - ServiceContainer 即是 JBoss MSC 的抽象,它抽象的是一个模块化的容器,它设计用来管理一系列服务
- ServiceTarget - 提供了添加服务,添加依赖等方法,另外这些添加只有在ServiceBuilder 的 install() 方法后才生效
- ServiceRegistry - 服务注册接口,可根据服务名获取一个服务,或获取所有服务名列表
public static ServiceContainer create() public static ServiceContainer create(String name) public static ServiceContainer create(int coreSize, long keepAliveTime, TimeUnit keepAliveTimeUnit) public static ServiceContainer create(String name, int coreSize, long keepAliveTime, TimeUnit keepAliveTimeUnit) public static ServiceContainer create(boolean autoShutdown) public static ServiceContainer create(String name, boolean autoShutdown) public static ServiceContainer create(int coreSize, long keepAliveTime, TimeUnit keepAliveTimeUnit, boolean autoShutdown) public static ServiceContainer create(String name, int coreSize, long keepAliveTime, TimeUnit keepAliveTimeUnit, boolean autoShutdown)
注意,这些create() 方法中的参数是用于实例化ServiceContainer时创建ThreadPoolExecutor。
ContainerExecutor
ServiceContainer 接口的实现类 ServiceContainerImpl 中有一个 ContainerExecutor 属性,其中在实例化ServiceContainerImpl被初始化,ContainerExecutor 实现了 ThreadPoolExecutor 且使用如下构造方法:
public ThreadPoolExecutor(int corePoolSize, int maximumPoolSize, long keepAliveTime, TimeUnit unit, BlockingQueue<Runnable> workQueue, ThreadFactory threadFactory, RejectedExecutionHandler handler)
如上使用一些初始化参数构建 ThreadPoolExecutor:
- corePoolSize - 线程池中保存的线程数,不管线程是否空闲,当线程数大小小于 corePoolSize 就新建线程,并处理请求
- maximumPoolSize - 线程池允许的最大线程数
- keepAliveTime - 当线程池中线程数大于 corePoolSize 时,多余的线程在等待空闲时间 keepAliveTime 后终止
- unit - keepAliveTime 的时间单位
- workQueue - Task 被执行之前首先至于此 workQueue,当然 workQueue 只保存实现 Runnable 的 Task,通常被 execute 方法提交
- threadFactory - 用来创建创建新线程
- handler - 当队列里累积的 Task 多于 workQueue 最大容量时用来处理新来的 Task
ContainerExecutor(final int corePoolSize, final int maximumPoolSize, final long keepAliveTime, final TimeUnit unit) { super(corePoolSize, maximumPoolSize, keepAliveTime, unit, new LinkedBlockingQueue<Runnable>(), new ThreadFactory() { private final int id = executorSeq.getAndIncrement(); private final AtomicInteger threadSeq = new AtomicInteger(1); public Thread newThread(final Runnable r) { Thread thread = new ServiceThread(r, ServiceContainerImpl.this); thread.setName(String.format("MSC service thread %d-%d", Integer.valueOf(id), Integer.valueOf(threadSeq.getAndIncrement()))); thread.setUncaughtExceptionHandler(HANDLER); return thread; } }, POLICY); }
如上,workQueue 没有定义容量限制,工作线程命名规则 MSC service thread %d-%d,所以我们在 JBoss MSC - 简单介绍及一个简单示例 中可以看到线程所谓名字如MSC service thread 1-1。
JBoss MSC ContainerExecutor 的启动是ServiceBuilder 的 install 方法,使的 ServiceContainerImpl 的 doExecute 方法中执行,此方法完成容器初始化:
void doExecute(final ArrayList<Runnable> tasks) { assert !holdsLock(this); if (tasks == null) return; final Executor executor = primaryRegistration.getContainer().getExecutor(); for (Runnable task : tasks) { try { executor.execute(task); } catch (RejectedExecutionException e) { task.run(); } } }
如 JBoss MSC - 简单介绍及一个简单示例 中的示例,我们只启动一个服务,但是示例执行完成后容器中有8个线程,这是因为我们初始化的 corePoolSize 为 8,当线程数小于 corePoolSize 就新建线程,并处理请求。
// coming soon
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。