文档章节

APDPlat的系统启动和关闭流程剖析

杨尚川
 杨尚川
发布于 2014/02/03 01:49
字数 931
阅读 414
收藏 4

 APDPlat接管了Spring的启动关闭权,为各种运行其上的开源框架和类库的无缝集成提供了支持。

 

当然,大家都知道,一个JAVA EE Web应用的入口点是web.xml,APDPlat当然也不例外,我们看看APDPlat是如何接管Spring的启动关闭权的:

 

<listener>
	<description>经过定制的spring监听器</description>
	<listener-class>org.apdplat.platform.spring.APDPlatContextLoaderListener</listener-class>
</listener>

 

/**
 * 自定义Spring的ContextLoaderListener
 * @author 杨尚川
 */
public class APDPlatContextLoaderListener extends ContextLoaderListener {    
    @Override
    public void contextInitialized(ServletContextEvent event) {
        //接管系统的启动
        SystemListener.contextInitialized(event);
        super.contextInitialized(event);
    }
    @Override
    public void contextDestroyed(ServletContextEvent event) {
        //接管系统的关闭
        SystemListener.contextDestroyed(event);
        super.contextDestroyed(event);
    }
}

 

在Spring启动和关闭之前,都会先调用org.apdplat.module.system.service.SystemListener来做预处理。

 

这只是接管启动和关闭权,关于无缝集成所做的定制请看org.apdplat.platform.spring、org.apdplat.platform.struts、org.apdplat.platform.compass这三个包里面的类,这里不做说明。

 

本文主要分析SystemListener在系统启动和关闭的时候都分别做了什么处理。

 

系统启动流程:

 

1、获取ContextPath

 

contextPath=sce.getServletContext().getContextPath();

 

public static String getContextPath() {
 return contextPath;
}

 

在部署APDPlat的时候,可能会有两种情况:一是部署在ROOT目录下,ContextPath为空,则地址为http://192.168.0.100;二是部署在非ROOT目录下,假设ContextPath为APDPlat_Web,则地址为http://192.168.0.100/APDPlat_Web。前端EXT JS和JSP以及后台服务在处理绝对路径和记录日志等情况的时候需要知道ContextPath的值,该值在系统启动的时候从应用服务器中获得,保存为静态变量,并通过静态方法暴露给系统使用。

 

2、获取RealPath

 

basePath=sce.getServletContext().getRealPath("/");
FileUtils.setBasePath(basePath);

 

整个APDPlat系统中的文件操作都以basePath为基础,通过basePath的值,我们可以得知Web应用存放在服务器上面的本地磁盘绝对路径,如:D:\Workspaces\NetBeansProjects\APDPlat2.5\APDPlat_Web\target\APDPlat_Web-2.5\,这样我们就可以对Web应用中的所有文件进行IO操作。

 

3、改变系统属性user.dir的值

 

userDir=FileUtils.getAbsolutePath("/WEB-INF/classes/data/");
System.setProperty("user.dir", userDir);

 

把user.dir重新指定到Web应用的/WEB-INF/classes/data/目录,此目录会存放索引文件,初始导入的数据文件。

 

4、为spring的配置做预处理

 

public static void prepareForSpring(){
	//供spring扫描组件用
	String basePackage=PropertyHolder.getProperty("basePackages");
	String localBasePackage=PropertyHolder.getProperty("basePackages.local");
	if(StringUtils.isNotBlank(localBasePackage)){
		basePackage=basePackage+","+localBasePackage;
	}
	System.setProperty("basePackage", basePackage);        
}

 

这里为用户在项目中自定义扫描组件的范围提供支持,用户可在config.local.properties配置文件中定义变量basePackages.local的值为自己的包名称。

 

5、注册模块

 

Enumeration<URL> ps = Thread.currentThread().getContextClassLoader().getResources("META-INF/services/module.xml");

 

根据模块描述文件module.xml识别类路径下的所有模块,注册模块,提取web资源和数据,为后续的组件扫描、模块初始化、数据库同步做准备。

 

6、解析所有的dic.xml文件,并生成供客户端EXT JS调用的文件

 

DictionaryGenerator.generateDic(basePath);

 

7、记录服务器启动日志(如启用)

 

//保存服务器启动日志
BufferLogCollector.collect(runingTime);

 

8、启动内存监视线程(如启用)

 

int circle=PropertyHolder.getIntProperty("monitor.memory.circle");
memoryMonitorThread=new MemoryMonitorThread(circle);
memoryMonitorThread.start();

 

 

 

系统关闭流程:

 

1、记录用户注销日志(如启用)

 

UserLoginListener.forceAllUserOffline();

 

2、记录服务器关闭日志(如启用)

 

//保存服务器关闭日志
BufferLogCollector.collect(runingTime);

 

3、停止内存监视线程(如启用)

 

memoryMonitorThread.running=false;
memoryMonitorThread.interrupt();

 

4、处理缓冲区中的日志

 

//在关闭系统之前,处理缓冲区中的日志
BufferLogCollector.close();

 

5、卸载JDBC驱动

 

    private static void deregisterDrivers() {
        Enumeration<Driver> drivers=DriverManager.getDrivers();
        while(drivers.hasMoreElements()){
            Driver driver=drivers.nextElement();
            try {
                DriverManager.deregisterDriver(driver);
            } catch (SQLException e) {
                LOG.warn("卸载JDBC驱动失败:"+driver, e);
                LOG.warn("Fail to uninstall JDBC driver:"+driver, e, Locale.ENGLISH);
            }
        }
    }

 

APDPlat托管在Github

© 著作权归作者所有

杨尚川

杨尚川

粉丝 1103
博文 220
码字总数 1624053
作品 12
东城
架构师
私信 提问
APDPlat如何自动建库建表并初始化数据?

APDPlat共支持10种数据库:DB2、DERBY、H2、HSQL、INFORMIX、MYSQL、ORACLE、POSTGRESQL、SQLSERVER、SYBASE。 数据库的默认配置信息在文件APDPlatCore/src/main/resources/org/apdplat/db.p...

杨尚川
2014/02/08
360
0
应用级产品开发平台 - APDPlat

APDPlat快速体验 APDPlat入门指南 APDPlat专题文章 APDPlat是Application Product Development Platform(应用级产品开发平台)的缩写。 APDPlat提供了应用容器、多模块架构、代码生成、安装...

杨尚川
2012/10/30
6.7K
0
基于word分词提供的文本相似度算法来实现通用的网页相似度检测

实现代码:基于word分词提供的文本相似度算法来实现通用的网页相似度检测 运行结果: 检查的博文数:128 1、检查博文:192本软件著作用词分析(五)用词最复杂99级,相似度分值:Simple=0.96...

杨尚川
2015/05/28
1K
0
APDPlat拓展搜索之集成ElasticSearch

APDPlat充分利用Compass的OSEM和ORM integration特性,提供了简单易用且功能强大的内置搜索特性。 APDPlat的内置搜索,在设计简洁优雅的同时,还具备了强大的实时搜索能力,用户只需用注解的...

杨尚川
2014/02/01
292
2
APDPlat拓展搜索之集成Solr

APDPlat充分利用Compass的OSEM和ORM integration特性,提供了简单易用且功能强大的内置搜索特性。 APDPlat的内置搜索,在设计简洁优雅的同时,还具备了强大的实时搜索能力,用户只需用注解的...

杨尚川
2014/02/01
662
0

没有更多内容

加载失败,请刷新页面

加载更多

好程序员Java教程分享Zookeeper基本原理与运用场景

好程序员Java教程分享Zookeeper基本原理与运用场景一、什么是Zookeeper? zookeeper是一个分布式的一致性协调服务。 换句话说,也可以把zookeeper看成一个小型的分布式文件系统。但是和FastD...

好程序员官网
12分钟前
3
0
mysql表情符

1 修改表字段为utf8md4 ALTER table property_info MODIFY `address` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci DEFAULT NULL 2 MySQL数据库服务器配置文件mysqld.cn......

干死it
32分钟前
2
0
正则表达式的基本语法

本文摘自LTP.NET知识库。 正则表达式的形式一般如下: /love/ 其中位于“/”定界符之间的部分就是将要在目标对象中进行匹配的模式。 用户只要把希望查找匹配对象的模式内容放入“/”定界符之...

木庄
34分钟前
3
0
java 框架有哪些?

十大常用框架: 一、SpringMVC 二、Spring 三、Mybatis 四、Dubbo 五、Maven 六、RabbitMQ 七、Log4j 八、Ehcache 九、Redis 十、Shiro 延展阅读: 一、SpringMVC Spring Web MVC是一种基于J...

java框架开发者
34分钟前
6
0
细谈Mysql事务

文章原创于公众号:程序猿周先森。本平台不定时更新,喜欢我的文章,欢迎关注我的微信公众号。 上一篇着重谈到了MySQL锁的概念,里面谈到了事务的概念,其实大部分开发者对于事务肯定不陌生,...

程序猿周先森
43分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部