什么是 JBoss MSC

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

  • 高并发容器(A highly concurrent state machine)
  • 无多相位,设计简单(No multiple phases, much simpler)
  • 不依赖 JMX 和 Java EE

JBoss MSC 它管理一系列 Service,WildFly中不论什么东西都是一个Service,如 EJB,JCA等,接下来我们说明说明是Service。

什么是 Service

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

Service 的状态例如以下图所看到的:

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

  • Service 在 DOWN 状态时能够从容器中移除,从而进入 REMOVED 状态
  • Service 在 DOWN 状态时能够载入启动,启动成功进入 STARTING 状态,启动失败进入 START_FAILED 状态
  • Service 在 START_FAILED 状态时能够尝试重新启动,尝试失败后能够退回 DOWN 状态
  • Service 在 STARTING 状态后进入 UP 状态
  • Service 在 UP 状态时能够停止进入 STOPPING 状态

一个简单演示样例

本演示样例简介怎样启动 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 同样,实际上它们都执行相似的代码。

JBoss 系列九十六:JBoss MSC - 简介及一个简单演示样例的更多相关文章

  1. JBoss 系列九十九:Rest WebService jBPM 6 集成演示样例

    概述 jBPM 6 提供 Rest API 供第三方应用整合使用 jBPM 6,本文演示假设通过 Rest API: 启动流程 获取流程实例信息 启动 User Task 完毕 User Task j ...

  2. JBoss 系列一 O O:Maven jBPM 6 集成演示样例

    概述 jBPM 6 中底层架构基于 Maven,所以我们能够非常easy的进行 Maven jBPM 6 集成演示样例,本文分三个部分: 基本原理介绍 Maven jBPM 6 集成 jBPM 6 中 ...

  3. [hadoop系列]Pig的安装和简单演示样例

    inkfish原创,请勿商业性质转载,转载请注明来源(http://blog.csdn.net/inkfish ).(来源:http://blog.csdn.net/inkfish) Pig是Yaho ...

  4. scrapy爬虫学习系列二:scrapy简单爬虫样例学习

    系列文章列表: scrapy爬虫学习系列一:scrapy爬虫环境的准备:      http://www.cnblogs.com/zhaojiedi1992/p/zhaojiedi_python_00 ...

  5. JBoss 系列十一:JBoss Cluster Framework Demo 介绍

    内容概要 JBoss Cluster Framework Demo包括JGruops.JBossCache.Infinispan,我们在随后的系列中会使用和运行这些示例来说明JGroups.JBoss ...

  6. (转)log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 1 老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  7. 1.1(学习笔记)Servlet简介及一个简单的实例

    一.Servlet简介 Servlet是使用Java语言编写的服务器端程序,可以生产动态的Web界面. 主要运行在服务器端,Servlet可以方便的处理客户端传来的HTTP请求,并返回一个响应. 二. ...

  8. log4j(六)——log4j.properties简单配置样例说明

    一:测试环境与log4j(一)——为什么要使用log4j?一样,这里不再重述 二:老规矩,先来个栗子,然后再聊聊感受 (1)使用配文件的方式,是不是感觉非常的清爽,如果不在程序中读取配置文件就更加的清 ...

  9. 神经进化学的简介和一个简单的CPPN(Compositional Pattern Producing Networks)DEMO

    近期迷上神经进化(Neuroevolution)这个方向,感觉是Deep Learning之后的一个非常不错的研究领域. 该领域的一个主导就是仿照人的遗传机制来进化网络參数与结构.注意,连网络结构都能 ...

随机推荐

  1. c-指针的指针

    概述: 贴上一个'经典C语言程序设计100例'的第77个程序 #include <stdio.h> int main(void) { char *s[]={"man", ...

  2. <address>标签,为网页加入地址信息

    一般网页中会有一些网站的联系地址信息需要在网页中展示出来,这些联系地址信息如公司的地址就可以<address>标签.也可以定义一个地址(比如电子邮件地址).签名或者文档的作者身份. 语法: ...

  3. jQuery之防止冒泡事件,冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件。

    冒泡事件就是点击子节点,会向上触发父节点,祖先节点的点击事件. 下面是html代码部分: <body> <div id="content"> 外层div元素 ...

  4. Java安全发布的理解

    看<Java并发编程实战>遇到如下问题 代码: /** * Created by yesiming on 16/11/11. */public class Holder { private ...

  5. spring resttemplate中的转码

    /* * 初始化RestTemplate,RestTemplate会默认添加HttpMessageConverter * 添加的StringHttpMessageConverter非UTF-8 所以先 ...

  6. 高性能IO设计模式之阻塞/非阻塞,同步/异步解析

    提到高性能,我想大家都喜欢这个,今天我们就主要来弄明白在高性能的I/O设计中的几个关键概念,做任何事最重要的第一步就是要把概念弄的清晰无误不是么?在这里就是:阻塞,非阻塞,同步,异步. OK, 现在来 ...

  7. hdu 1281棋盘游戏(二分匹配)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1281   Problem Description 小希和Gardon在玩一个游戏:对一个N*M的棋盘, ...

  8. css3之box-sizing

    css盒子模型中包括几种重要的属性,包括margin.border.padding以及content.但浏览器对其盒子模型的解释则有所不痛,启用标准模式还是IE(怪)模式是与当前页面的文档声明相关的. ...

  9. centos账户的uid和gid

    修改/etc/passwd和/etc/group文件的UID和GID为0,可以获得root权限,不过不推荐~ UID和GID Linux系统如何区别不同的用户呢?可以很自然地想到,使用不同的用户名应该 ...

  10. jQuery操作cookie

    验证jquery的cookie插件时才知道原先文件一直在桌面上放着执行发现没有效果,文件必须放在web服务器下面执行才会生效,晕菜! $.cookie(name,value,{expires: 7,p ...