JBoss 系列九十六:JBoss MSC - 简单介绍及一个简单示例

时间:2014-04-29 13:26:21   收藏:0   阅读:284

什么是 JBoss MSC 

JBoss MSC 即 JBoss Modular Service Container,是第三代 JBoss 产品 JBoss 7和WildFfly的内核,JBoss MSC 替换了之前的 JMX Kernel 和 MicroContainer,它主要特定可以总结如下三点:

JBoss MSC 它管理一系列 Service,WildFfly中任何东西都是一个Service,如 EJB,JCA等,接下来我们说明说明是Service。

什么是 Service

JBoss 7/WildFfly 中 Service 的定义:一个可相互依赖的 POJO 类。

Service 的状态如下图所示:

mamicode.com,码迷

JBoss MSC Service 的状态比较简单,和之前的JMX Kernel 和 MicroContainer相比,没有多相位设计,如图:

一个简单示例

本示例简单介绍如何启动 JBoss MSC 并加载一个 Service。

Service 实现

一个 Service 必须实现 org.jboss.msc.service.Service<T> 接口,如下 MyService 的实现如下:

package org.jboss.msc.quickstart;

import org.jboss.msc.service.Service;
import org.jboss.msc.service.ServiceName;
import org.jboss.msc.service.StartContext;
import org.jboss.msc.service.StartException;
import org.jboss.msc.service.StopContext;

public class MyService implements Service<MyServiceManager> {
	
	final static ServiceName SERVICE = ServiceName.of("service");
	
	private MyServiceManager manager;
	
	public MyService(MyServiceManager manager) {
		this.manager = manager;
	}

	public MyServiceManager getValue() throws IllegalStateException, IllegalArgumentException {
		return manager;
	}

	public void start(StartContext context) throws StartException {
		manager.initialize("init");
	}

	public void stop(StopContext context) {
		manager.cleanup();
	}

}

相关 MyServiceManager 实现如下:

package org.jboss.msc.quickstart;

public class MyServiceManager {
	
	private String description;
	
	public void initialize(String description) {
        this.description = description;
    }
	
	public void cleanup() {
        this.description = null;
    }

	public String getDescription() {
		return description;
	}

}

启动 JBoss MSC 加载 MyService

我们可以在Main方法中启动加载MyService,如下所示:

		ServiceContainer serviceContainer = ServiceContainer.Factory.create();
		Service<MyServiceManager> service = new MyService(new MyServiceManager());
		ServiceBuilder<MyServiceManager> builder = serviceContainer.addService(MyService.SERVICE, service);
		ServiceController<MyServiceManager> controller = builder.install();

思考

如上代码启动了JBoss MSC,JBoss 7启动时也启动了 JBoss MSC,然后逐一加载Service。运行如上代码后,我们收集线程 Dump 分析启动的线程,我们会发现如下线程:

"MSC service thread 1-1" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-2" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-3" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-4" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-5" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-6" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-7" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)
"MSC service thread 1-8" prio=10 tid=0x6b904400 nid=0x14fa waiting on condition [0x6b55a000]
   java.lang.Thread.State: WAITING (parking)

如果熟悉 JBoss 7或 WildFLy 线程,我们会发现这些线程和 JBoss 7或 WildFLy 相同,实际上它们都运行类似的代码。



评论(0
© 2014 mamicode.com 版权所有 京ICP备13008772号-2  联系我们:gaon5@hotmail.com
迷上了代码!