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

什么是 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,WildFfly中任何东西都是一个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 相同,实际上它们都运行类似的代码。

时间: 2024-10-25 18:32:48

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

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

什么是 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 和 J

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

最近迷上神经进化(Neuroevolution)这个方向,感觉是Deep Learning之后的一个很不错的研究领域.该领域的一个主导就是仿照人的遗传机制来进化网络参数与结构.注意,连网络结构都可以进化,就是不像是传统的神经网络,结构是提前定义好的. 最近这个领域研究的比较多的是 弗罗里达大学的Stanley教授,主要的贡献有NEAT,HyperNEAT以及Novelty Search,有兴趣的可以去google之. NEAT与HyperNEAT都是一种indirect coding算法,目的在

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

ServiceContainer 接口类图 ServiceContainer 接口类图如下所示: 如图: ServiceContainer - ServiceContainer 即是 JBoss MSC 的抽象,它抽象的是一个模块化的容器,它设计用来管理一系列服务 ServiceTarget - 提供了添加服务,添加依赖等方法,另外这些添加只有在ServiceBuilder 的 install() 方法后才生效 ServiceRegistry - 服务注册接口,可根据服务名获取一个服务,或获取所

JBoss 系列九十九:Rest WebService jBPM 6 集成示例

概述 jBPM 6 提供 Rest API 供第三方应用整合使用 jBPM 6,本文演示如果通过 Rest API: 启动流程 获取流程实例信息 启动 User Task 完成 User Task jBPM 6 中使用 RestEasy 实现 Rest WebService ,所以我们通过 Rest 客户端 API 与 jBPM 6 所提供的 Rest API 交互. 本文所使用的流程如下 如上流程只有一个 User Task 节点,User Task 执行开始和执行结束都输出相关提示.流程 I

【EJB系列】(一)——JBOSS7中开发一个简单的EJB应用

导读 在本篇文章中你将了解到如何使用JBOSS7开发出一个简单的EJB应用以及在这个过程中遇到的问题. 环境 MyEclipse10 JBOSS7 JDK1.8.0 准备 MyEclipse10中配置JBOSS7 了解JBOSS目录结果 首先了解一下JBOSS7的目录结构,和之前的版本不一样 在 JBoss 7 中,文件系统分为两部分: 1. 独立服务器standalone 2. 域服务器domain (这是 JBoss 7 首次引入的) - 用于统一的管理多个实例 bin: 包含启动的脚本,用

WebSocket介绍和一个简单的聊天室

WebSocket是什么呢? WebSocket一种在单个 TCP 连接上进行全双工通讯的协议.WebSocket通信协议于2011年被IETF定为标准RFC 6455,并被RFC7936所补充规范,WebSocketAPI被W3C定为标准. WebSocket 是独立的.创建在 TCP 上的协议,和 HTTP 的唯一关联是使用 HTTP 协议的101状态码进行协议切换,使用的 TCP 端口是80,可以用于绕过大多数防火墙的限制. WebSocket 使得客户端和服务器之间的数据交换变得更加简单

Adaline神经网络简单介绍和MATLAB简单实现

Adaline神经网络 Adaline利用了最小二乘法的思想,相较于感知机神经网络,对于数据的线性可分的要求更低一些,可以允许一些异常数据. 上面描述了迭代求解的过程,但是在x0(k+1)这里没看懂,如果是更新θ应该是w0(k+1)才对.应该是PPT有错. 我们来说明下迭代求解需要注意的地方. 首先,将θ并入到w中去,因为θ前面的系数始终是1,所以x也多了一列,这一列都是1. x=[1,x1,x2,?,xn]Tw=[θ,w1,?,wn] 然后是迭代的结束条件.在代码实现中,是计算w(k?1)与w

Python运维三十六式:用Python写一个简单的监控系统

市面上有很多开源的监控系统:Cacti.nagios.zabbix.感觉都不符合我的需求,为什么不自己做一个呢 用Python两个小时徒手撸了一个简易的监控系统,给大家分享一下,希望能对大家有所启发 首先数据库建表 建立一个数据库“falcon”,建表语句如下: 1 CREATE TABLE `stat` ( 2 `id` int(11) unsigned NOT NULL AUTO_INCREMENT, 3 `host` varchar(256) DEFAULT NULL, 4 `mem_fr

hdu 1757 (矩阵快速幂) 一个简单的问题 一个简单的开始

题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1757 题意不难理解,当x小于10的时候,数列f(x)=x,当x大于等于10的时候f(x) = a0 * f(x-1) + a1 * f(x-2) + a2 * f(x-3) + …… + a9 * f(x-10); 所求的是f(x)取m的模,而x,m,a[0]至a[9]都是输入项 初拿到这道题,最开始想的一般是暴力枚举,通过for循环求出f(x)然后再取模,但是有两个问题,首先f(x)可能特别大,其