为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
http://bluedash.net/spaces/JBoss%20Module介绍
http://bluedash.net/spaces/JBoss%20AS%207%20快速上手
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
public class SubsystemExtension implements Extension {...public static final String SUBSYSTEM_NAME = "tracker";}
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); }}
<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>
private static class SubsystemParser implements XMLStreamConstants, XMLElementReader<List<ModelNode>>, XMLElementWriter<SubsystemMarshallingContext> {@Overridepublic void writeContent(XMLExtendedStreamWriter writer, SubsystemMarshallingContext context) throws XMLStreamException {...}@Overridepublic void readElement(XMLExtendedStreamReader reader, List<ModelNode> list) throws XMLStreamException {...}}
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); }}
class SubsystemAdd extends AbstractBoottimeAddStepHandler {@Overridepublic void performBoottime(...) throws OperationFailedException { processorTarget.addDeploymentProcessor(SubsystemDeploymentProcessor.PHASE, SubsystemDeploymentProcessor.PRIORITY, new SubsystemDeploymentProcessor());}}
public class SubsystemDeploymentProcessor implements DeploymentUnitProcessor { @Override public void deploy(...) throws DeploymentUnitProcessingException { ... } @Override public void undeploy(...) { ... }}