首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 软件管理 > PowerDesigner >

APDPlat的系统启动和封锁流程剖析

2014-03-30 
APDPlat的系统启动和关闭流程剖析经过定制的spring监听器

APDPlat的系统启动和关闭流程剖析
<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

引用[u][i][b][/b][/i][/u]
[/list][/img][/url][/url]

热点排行