`
阿男bluedash
  • 浏览: 168868 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

为JBoss AS7添加新模块

阅读更多
注:文本的内容主要探讨JBoss AS7的实现细节,涉及AS7的内核代码及分析,需要耗费大量时间与精力来学习理解。如果你只是基于JBoss进行应用开发或是日常运维管理,可以忽略本文,看看网站上其它和AS7使用及开发相关的内容。

在软件领域,模块化的设计思想变得越来越重要,它的目的是使得软件变得容易扩展。在这一方面,最典型的例子当属Linux内核:Linux Kernel通过模块化设计,允许开发人员撰写功能代码,并以驱动模块的方式加载进内核,使得系统扩展变得非常容易。JBoss AS7吸取了不少来自于操作系统方面的设计经验,通过"模块化"的设计,让开发人员可以通过搭积木的方式,向AS7中添加新的组件。

AS7有篇文档通过代码示例详细介绍了如何为AS7撰写新的模块,并加载进AS7核心:

https://docs.jboss.org/author/display/AS7/Extending+JBoss+AS+7


这篇文档中的语言比较简练,有些点说明的不够细致,因此撰写本文的目的是针对这个例子做出一些补充说明帮助理解,因此,将上面这篇文档和本文合起来阅读才是完整的。

首先,阅读上面这篇文档需要一些准备知识:AS7使用JBoss Modules来实现模块化的设计,在核心中依赖JBoss Modules进行模块的定义,加载,生命周期的管理。因此,首先需要理解JBoss Modules,可以参考下面这篇文档:

http://bluedash.net/spaces/JBoss%20Module介绍


如果你对AS7的基本使用还不熟悉,可以参考这篇文档:

http://bluedash.net/spaces/JBoss%20AS%207%20快速上手


这些准备工作做完后,就可以开始阅读 _Extending JBoss AS 7_ 。跟着文档里面的示例一步一步实验,到最后调通示例并对整体思路有个比较清楚的把握,大概需要10几个小时的时间,所以请准备出三、四天左右的时间来看这个示例。

我把一些原文中阐述不够详尽的地方,补充说明如下:

示例说明及使用

Extending JBoss AS 7中的示例的目的是为AS7制作一个记录已部署项目数量的模块。当这个模块加载进AS7以后,AS7的日志会定时输出系统中已部署的项目数量。AS7的日志输出类似如下:

12:04:24,935 INFO  [stdout] (Thread-12) Current deployments deployed while war tracking active:
12:04:24,935 INFO  [stdout] (Thread-12) [my-app.war]
12:04:24,935 INFO  [stdout] (Thread-12) Cool: 0


这个模块的名字叫做Tracker。这个名字是在SubsystemExtension中定义的:

public class SubsystemExtension implements Extension {
...
public static final String SUBSYSTEM_NAME = "tracker";
}
                 

整个模块的加载入口点为SubsystemExtension的initialize方法:

public class SubsystemExtension implements Extension {
...
    @Override
    public void initialize(ExtensionContext context) {
        ...
        final ManagementResourceRegistration registration = subsystem.registerSubsystemModel(SubsystemProviders.SUBSYSTEM);
        ...
        //Add the type child
        ManagementResourceRegistration typeChild = registration.registerSubModel(PathElement.pathElement("type"), SubsystemProviders.TYPE_CHILD);
        ...
        subsystem.registerXMLElementWriter(parser);
    }
}


initialize中将模块中的各组件给装配到一起。两个ManagementResourceRegistration将组件注册进AS7;最后一行subsystem.registerXMLElementWriter(parser)负责tracker在AS7配置文件中配置内容的读取工作。以下是AS7中tracker相关的配置:

<extensions>
	<extension module="com.acme.corp.tracker"/>
</extensions>

<profile>
<subsystem xmlns="urn:com.acme.corp.tracker:1.0">
	<deployment-types>
		<deployment-type suffix="sar" tick="10000"/>
		<deployment-type suffix="war" tick="10000"/>
	</deployment-types>
</subsystem>
</profile>


源代码中的parser就是负责将模块的配置转化成xml。Parser定义在SubsystemExtension中的SubsystemParser:

private static class SubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>, XMLElementWriter<SubsystemMarshallingContext> {

	@Override
	public void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {
		...
	}

	@Override
	public void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {
		...
	}
}


此外,在整个模块的加载入口点,SubsystemExtension的initialize方法中,注册了SubsystemAdd:

public class SubsystemExtension implements Extension {
...
    @Override
    public void initialize(ExtensionContext context) {
        ...
        //We always need to add an 'add' operation
        registration.registerOperationHandler(ADD, SubsystemAdd.INSTANCE, SubsystemProviders.SUBSYSTEM_ADD, false);
    }
}


AS7内部定义了模块的生命周期,其中Add是指模块被添加时要做的事,因此SubsystemAdd就是在模块被添加进AS7内核时,要执行的工作:

class SubsystemAdd extends AbstractBoottimeAddStepHandler {
	@Override
	public void performBoottime(...) throws OperationFailedException {
 
			processorTarget.addDeploymentProcessor(SubsystemDeploymentProcessor.PHASE, SubsystemDeploymentProcessor.PRIORITY, new SubsystemDeploymentProcessor());
	}

}


注意到SubsystemAdd扩展的是AbstractBoottimeAddStepHandler,从名字就可以看出,AbstractBoottimeAddStepHandler的生命周期对应于模块启动时加载的这个环节。里面的performBoottime方法将将整个模块的主要功能,SubsystemDeploymentProcessor,添加进AS7内核。接下来我们可以看下SubsystemDeploymentProcessor:

public class SubsystemDeploymentProcessor implements DeploymentUnitProcessor {
    @Override
    public void deploy(...) throws DeploymentUnitProcessingException {
    	...
    }

    @Override
    public void undeploy(...) {
    	...
    }
}


SubsystemDeploymentProcessor实现的是DeploymentUnitProcessor,这是AS7提供的具多功能Processor模块当中的一种。开发者可根据自己的功能需要,选择不同的Processor来进行实现。这个DeploymentUnitProcessor从名字就可以看出,它是处理和工程部署有关的工作时,需要使用的Processor接口。

DeploymentUnitProcessor提供两个方法:deploy和undeploy,分别对应于当有新项目部署进AS7,或有既存项目从AS7中去除时,系统要做的事情。因此例子中的代码通过实现这两个方法,就完成了对AS7中部署项目的跟踪记录工作。

以上是整个例子的设计思路及脉络。如果要想完全理解这个例子中的全部细节,还需要拿出几天的时间来仔细阅读文档,并实际动手玩玩看这个例子。一旦掌握了AS7的模块化设计思路,你就可以慢慢体会体会到它的方便之处,并可以很方便地对AS7进行功能扩展和定制。

总的来讲,对AS7的模块开发,变得越来越像对Linux Kernel的驱动开发。理解了这种模块化的设计思路,对于自己架构应用时也很有助益。
分享到:
评论

相关推荐

    JBoss AS7教程

    1. 模块化架构:JBoss AS7采用了全新的模块化设计,将各种组件和服务分离,提高了系统的可扩展性和性能。 2. 内存中的类加载器:通过优化类加载机制,实现更快的应用启动和更小的内存占用。 3. 基于AIO的网络栈:...

    jbossAS7开发指南

    1. **隐式模块依赖的概念**: 隐式模块依赖指的是 JBoss AS7 自动为部署添加的一些模块依赖,这些依赖通常是为了满足部署中某些组件的需求而添加的。 2. **隐式模块依赖的添加时机**: 当部署应用程序时,如果检测到...

    jboss-as-7.1.0.CR1b.zip

    1. **模块化架构**:JBoss AS 7引入了全新的模块化设计,将不同的Java EE组件分隔为独立的模块,这提高了系统的灵活性和可维护性,同时也优化了内存使用和启动速度。 2. **内存中的类加载器**:新的类加载系统允许...

    jboss7 文档

    JBoss AS 7内置了强大的安全机制,支持SSL/TLS加密通信、基于角色的访问控制、LDAP集成以及自定义认证模块。通过这些机制,可以确保应用程序的数据安全和用户认证的安全性。 #### 六、社区与支持 JBoss AS 7拥有...

    JBoss_AS7+JBoss_Tools+Eclipse3.7集成介绍

    通过 "Help -&gt; Install New Software…" 功能,用户可以轻松地添加和更新 JBoss Tools 插件,以增强 Eclipse 对 JBoss AS7 的支持。 集成步骤包括安装 JDK6、Eclipse Indigo 3.7,然后通过指定的更新站点安装 JBoss...

    jboss7开发部署详细文档

    首先,需要安装jboss工具,然后需要创建一个新的服务器,选择jboss7作为服务器类型。在创建服务器后,需要配置jboss7的启动参数,例如,可以设置jboss的启动模式为 debug 或生产模式。 三、项目部署 在jboss7中,...

    Jboss7快速入门手册.pdf

    #### 二、为什么JBoss AS 7如此快速 - **轻量级架构**:采用模块化设计,减少了不必要的组件加载,提升了启动速度。 - **优化的资源管理**:改进了内存管理机制,降低了内存占用,提高了运行效率。 - **高效的服务...

    JBOSS7学习笔记

    2. **基于AS7的基础架构**:JBoss7是基于AS7构建的,AS7放弃了传统的Classloading和Service Bootstrap机制,转而采用了一种名为"Unified Class Loading"的新模型,这极大地提升了启动速度和内存管理效率。...

    JBoss AS5 安装上手指南

    JBoss AS5 版本是 JBoss AS 的一个重要版本,引入了许多新的特性和改进。本文档旨在提供一个全面的安装与上手指南,帮助开发者快速掌握 JBoss AS5 的安装配置及基本使用方法。 #### 二、新特性概述 ##### 1.1 概览 ...

    JBOSS7配置及管理员手册

    ### JBossAS7中的新概念——域 **域(Domain)**是一种管理多个服务器实例的模型,它将一组服务器组织在一起,由一个中心化的管理控制器统一管理。这与传统的**群集(Cluster)**不同,后者侧重于提供高可用性和负载...

    jboss7.1 linux版本

    3. **配置环境变量**:设置`JBOSS_HOME`指向JBoss AS的安装目录,并添加到`PATH`环境变量中。 4. **启动和停止服务器**:通过`JBOSS_HOME/bin`目录下的`standalone.sh`或`domain.sh`脚本启动和停止服务器。 5. **...

    ProJee6-jboss7.zip uploaded

    1. **基于模块的类加载器**:JBoss AS 7使用模块系统,提高了启动速度和内存效率。 2. **更轻量级的架构**:设计目标是快速启动和低内存占用,使得它更适合云环境和大规模部署。 3. **统一的部署元数据**:XML配置...

    JBoss7配置指南及管理员手册

    #### 二、为什么JBoss AS7这么快 JBoss AS 7之所以能够实现如此高的性能,主要是因为以下几个方面的改进: - **启动时间缩短**:通过优化内部组件的加载顺序和方式,显著减少了启动所需的时间。 - **内存占用减少**...

    JBOSS7部置

    标题与描述概述的知识点主要集中在如何在JBoss7.1环境下使用Eclipse...1. **在Eclipse中添加JBossTools仓库**:通过`Help`-&gt;`Install New Software`-&gt;`Add`,输入仓库名称与位置,例如:Name: JBossTools,Location: `...

    jboss7 + EJB3

    - 配置pom.xml或build.gradle:添加JBOSS AS 7的依赖,确保项目可以正确构建并打包为WAR或EAR文件。 - 创建部署描述符:虽然EJB3倾向于使用注解,但有时仍需在`ejb-jar.xml`或`META-INF/application.xml`中进行...

    JBoss 引用 module 说明

    例如,添加新的模块、查询现有模块、更新模块配置等。此外,IDE如Eclipse和IntelliJ IDEA也有插件支持对JBoss模块的管理。 7. **源码分析** 对于深入理解JBoss模块系统的工作原理,查看源码是很有帮助的。JBoss AS...

    jboss-as-sprint-int-5.0.0.GA.jar jboss-spring-int-vfs.jar

    1. **jbosss-as-spring-int-5.0.0.GA.jar**:这个文件是JBoss Application Server对Spring框架集成的支持模块,版本为5.0.0.GA。Spring是一个广泛使用的轻量级框架,它简化了Java EE应用的开发,提供了一种声明式...

    使用eclipse通过jboss开发简单的ejb应用(jboss7.x & ejb3.x)

    1. **设置环境**:确保已经安装了Eclipse IDE和JBoss Developer Studio插件,同时在系统中安装了JBoss AS 7.x。 2. **创建EJB项目**:在Eclipse中,选择“File” &gt; “New” &gt; “Dynamic Web Project”,然后在项目...

    jboss4.3 起步指南

    - **易于扩展**:开放式的架构设计,方便开发者根据实际需求添加或修改功能模块。 #### 安装与配置 - **基本安装流程**: - 下载JBoss AS 4.3的安装包。 - 解压到指定目录。 - 配置环境变量,如设置`JAVA_HOME`...

Global site tag (gtag.js) - Google Analytics