自动监听器 PropertiesListener

package  org.stephencat.listener;

import  javax.servlet. * ;

/**
 * 自动监听器
 * 
@author  stephen
 *
 
*/
public   class  PropertiesListener  implements  ServletContextListener  {
    
    
/**
     * 自动监听时钟
     
*/
    
private  PropertiesTimer rt  =   null ;
    
    
public   void  contextInitialized(ServletContextEvent event) {
        String status 
=   " Properties listener start . " ;
        event.getServletContext().log(status);
        System.out.println(status);
        
        
//  激活自动监听时钟
        rt  =   new  PropertiesTimer( 15 , event.getServletContext());
        rt.start();
    }
    
    
public   void  contextDestroyed(ServletContextEvent event) {
        String status 
=   " Properties listener stop . " ;
        event.getServletContext().log(status);
        System.out.println(status);
        
        
//  停止自动监听时钟
         if  (rt  !=   null ) {
            rt.stop();
        }
    }
}

自动监听时钟 PropertiesTimer

package  org.stephencat.listener;
import  java.util. * ;
import  javax.servlet. * ;


/**
 * 自动监听时钟
 * 
@author  stephen
 *
 
*/
public   class  PropertiesTimer {
    
    
private   final  Timer timer  =   new  Timer();
    
private   final   int  sec;
    
private  ServletContext context  =   null ;
    
    
public  PropertiesTimer( int  seconds, ServletContext context) {
        sec 
=  seconds;
        
this .context  =  context;
    }
    
    
/**
     * 启动自动监听任务
     
*/
    
public   void  start() {
        
        
//  取得当前日期时间
        Date date  =   new  Date();
        
        
//  执行自动监听计划
        timer.schedule( new  PropertiesTask( this .context), date, sec  *   1000 );
    }
    
    
/**
     * 停止自动监听任务
     
*/
    
public   void  stop() {
        timer.cancel();

    }

}

自动监听任务 PropertiesTask

package  org.stephencat.listener;
import  java.io.IOException;
import  java.io. * ;
import  java.util. * ;

import  javax.servlet. * ;
/**
 * 自动监听任务
 * 
@author  stephen
 *
 
*/
public   class  PropertiesTask  extends  TimerTask {
    
    
private  ServletContext context  =   null ;
    
/**
     * 配置文件的最后更新时间
     
*/
    
private   long  lastModified  =   0 ;
    
    
/**
     * 构造一个自动更新任务
     * 
@param  context
     
*/
    
public  PropertiesTask(ServletContext context){
        
this .context  =  context;
        System.out.println(
" A task instance is created now. " );  //  任务在整个 application 周期内只创建一次。
    }
    
    
/**
     * 每次执行任务时显示一个随机数。
     
*/
    
public   void  todoTestRandom(){
        System.out.println(
" Task running " );
        context.setAttribute(
" random " , String.valueOf(Math.random()));
        System.out.println((String)context.getAttribute(
" random " ));
    }
    
    
/**
     * 监听配置文件是否被更新。
     
*/
    
public   void  todoTestFileStatus(){
        System.out.println(
" Getting file status " );
        System.out.println(
this .isFileUpdated( " WEB-INF/platforms/test.properties " ));
    }
    
    
/**
     * 监听配置文件是否被更新,自动更新文件中的配置项存储到 application 变量中。
     
*/
    
public   void  todo(){
        String filename 
=   " WEB-INF/platforms/test.properties " ;
        
if ( this .isFileUpdated(filename)){
            
            System.out.println(
" Getting properties " );
            
try {
                
this .loadProperties( " test " , filename);
            }
catch (IOException ioe){
                System.err.println(ioe.getMessage());
            }
        }
        System.out.println(
" Test value is:  "   +   this .getTestProperty( " name " ));
    }
    
    
public   void  run() {
        todoTestRandom();
        todo();
        
// todo();
    }
    
    
/**
     * 判断物理文件是否已被更新
     * 
@param  filename 物理文件名
     * 
@return  是 true 否 false
     
*/
    
private   boolean  isFileUpdated(String filename){
        File file 
=   new  File(context.getRealPath(filename));
        
if (file.isFile()){
            
long  lastUpdateTime  =  file.lastModified();
            
if (lastUpdateTime  >   this .lastModified){
                System.out.println(
" The properties file was modified. " );
                
this .lastModified  =  lastUpdateTime;
                
return   true ;
            }
else {
                System.out.println(
" The properties file was not modified. " );
                
return   false ;
            }
        }
else {
            System.out.println(
" The path does not point to a file. " );
            
return   false ;
        }
    }
    
    
/**
     * 获取配置文件
     * 
@param  key
     * 
@param  filename
     * 
@return
     
*/
    
public   void  loadProperties(String key, String filename)  throws  IOException{
        Properties prop 
=   new  Properties();
        InputStream stream 
=  context.getResourceAsStream(filename);
        prop.load(stream);
        
if (stream != null ){
            stream.close();
        }
        context.setAttribute(key, prop);
    }
    
    
/**
     * 从 application 取配置项的值
     * 
@param  key 配置项的键名
     * 
@return  配置项的值
     
*/
    
public  String getTestProperty(String key){
        Properties prop 
=  (Properties)context.getAttribute( " test " );
        
if (prop == null ){
            
return   null ;
        }
else {
            
return  (String)prop.get(key);
        }
    }

}

web.xml 配置

<? xml version="1.0" encoding="GB18030" ?>
< web-app  version ="2.4"  
    xmlns
="http://java.sun.com/xml/ns/j2ee"  
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance"  
    xsi:schemaLocation
="http://java.sun.com/xml/ns/j2ee 
    http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"
>
     
< listener >
    
< listener-class > org.stephencat.listener.PropertiesListener </ listener-class >
</ listener >     
</ web-app >