`
阿男bluedash
  • 浏览: 168051 次
  • 性别: 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的驱动开发。理解了这种模块化的设计思路,对于自己架构应用时也很有助益。
分享到:
评论

相关推荐

    node-v5.11.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于BP用matlab实现车牌识别.zip

    基于MATLAB的系统

    Java毕业设计-基于SSM框架的学生宿舍管理系统(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的学生宿舍管理系统(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:445】 https://pan.quark.cn/s/b3a97032fae7

    HTML+CSS+JS小项目集合.zip

    html Tab切换 检测浏览器 事件处理 拖拽 Cookie JavaScript模板 canvas canvas画图 canvas路径 WebGL示例 HTML5+CSS3 照片墙 幽灵按钮 综合实例 100du享乐网 高仿小米首页

    node-v6.17.1-linux-ppc64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    gRPC C++快速序列号跨平台库

    gRPC是轻量型且高性能的。 其处理速度可以比JSON序列化快 8 倍,消息小60%到 80%。 在Microsoft Windows Communication Foundation (WCF) 中,gRPC的性能超过经过高度优化的NetTCP绑定的速度和效率。 与偏向于Microsoft堆栈的NetTCP不同,gRPC是跨平台的。

    基于SSM+Vue的电子书籍敏感字识别系统毕业设计(源码+录像+说明).rar

    基于SSM+Vue的电子书籍敏感字识别系统毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:447】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员管理字典管理、公告信息管理、敏感词管理、书籍管理、用户管理、章节管理、作者管理、管理员管理等功能。【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:447】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 管理员管理字典管理、公告信息管理、敏感词管理、书籍管理、用户管理、章节管理、作者管理、管理员管理等功能。

    node-v6.10.3-linux-ppc64le.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    基于深度学习的USPS手写体识别模型.zip

    基于深度学习的USPS手写体识别模型.zip

    Java毕业设计-基于SSM框架的小码创客教育教学资源库(源码+演示视频+说明).rar

    Java毕业设计-基于SSM框架的小码创客教育教学资源库(源码+演示视频+说明).rar 【项目技术】 开发语言:Java 框架:ssm+vue 架构:B/S 数据库:mysql 【演示视频-编号:468】 https://pan.quark.cn/s/b3a97032fae7 【实现功能】 本基于SSM的小码创客教育教学资源库的设计与实现有管理员,校长,教师,学员四个角色。管理员可以管理校长,教师,学员等基本信息,校长角色除了校长管理之外,其他管理员可以操作的校长角色都可以操作。教师可以发布论坛,课件,视频,作业,学员可以查看和下载所有发布的信息,还可以上传作业。

    大二上python课设,一个基于max-min算法以及深度强化学习的井字棋游戏.zip

    大二上python课设,一个基于max-min算法以及深度强化学习(参考谷歌论文mastering the game of go without human knowledge)的井字棋游戏.zip

    node-v6.14.4-linux-arm64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.9.1-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    node-v4.7.2-sunos-x64.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    C# QuadTree For CAD

    cad环境下的四叉树代码,提高图形查速度

    node-v0.12.5-x86.msi

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

    12 催货通知单-EPES19-SC-CG-027-2023.xlsx

    12 催货通知单-EPES19-SC-CG-027-2023.xlsx

    基于SSM+JSP的家具销售库存管理信息系统毕业设计(源码+录像+说明).rar

    基于SSM+JSP的家具销售库存管理信息系统毕业设计(源码+录像+说明).rar 【项目技术】 开发语言:Java 框架:ssm+jsp 架构:B/S 数据库:mysql 【演示视频-编号:493】 https://pan.quark.cn/s/b3a97032fae7

    node-v6.12.1-sunos-x86.tar.xz

    Node.js,简称Node,是一个开源且跨平台的JavaScript运行时环境,它允许在浏览器外运行JavaScript代码。Node.js于2009年由Ryan Dahl创立,旨在创建高性能的Web服务器和网络应用程序。它基于Google Chrome的V8 JavaScript引擎,可以在Windows、Linux、Unix、Mac OS X等操作系统上运行。 Node.js的特点之一是事件驱动和非阻塞I/O模型,这使得它非常适合处理大量并发连接,从而在构建实时应用程序如在线游戏、聊天应用以及实时通讯服务时表现卓越。此外,Node.js使用了模块化的架构,通过npm(Node package manager,Node包管理器),社区成员可以共享和复用代码,极大地促进了Node.js生态系统的发展和扩张。 Node.js不仅用于服务器端开发。随着技术的发展,它也被用于构建工具链、开发桌面应用程序、物联网设备等。Node.js能够处理文件系统、操作数据库、处理网络请求等,因此,开发者可以用JavaScript编写全栈应用程序,这一点大大提高了开发效率和便捷性。 在实践中,许多大型企业和组织已经采用Node.js作为其Web应用程序的开发平台,如Netflix、PayPal和Walmart等。它们利用Node.js提高了应用性能,简化了开发流程,并且能更快地响应市场需求。

Global site tag (gtag.js) - Google Analytics