日韩黑丝制服一区视频播放|日韩欧美人妻丝袜视频在线观看|九九影院一级蜜桃|亚洲中文在线导航|青草草视频在线观看|婷婷五月色伊人网站|日本一区二区在线|国产AV一二三四区毛片|正在播放久草视频|亚洲色图精品一区

分享

Java 多線程 監(jiān)聽(tīng)文件改動(dòng),文件一有改動(dòng)就重新加載配置文件信息

 CevenCheng 2010-08-04
自動(dòng)監(jiān)聽(tīng)器 PropertiesListener

package org.stephencat.listener;

import javax.servlet.*;

/**
 * 自動(dòng)監(jiān)聽(tīng)器
 * 
@author stephen
 *
 
*/
public class PropertiesListener implements ServletContextListener  {
    
    
/**
     * 自動(dòng)監(jiān)聽(tīng)時(shí)鐘
     
*/
    
private PropertiesTimer rt = null;
    
    
public void contextInitialized(ServletContextEvent event) {
        String status 
= "Properties listener start .";
        event.getServletContext().log(status);
        System.out.println(status);
        
        
// 激活自動(dòng)監(jiān)聽(tīng)時(shí)鐘
        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);
        
        
// 停止自動(dòng)監(jiān)聽(tīng)時(shí)鐘
        if (rt != null) {
            rt.stop();
        }
    }
}

自動(dòng)監(jiān)聽(tīng)時(shí)鐘 PropertiesTimer

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


/**
 * 自動(dòng)監(jiān)聽(tīng)時(shí)鐘
 * 
@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;
    }
    
    
/**
     * 啟動(dòng)自動(dòng)監(jiān)聽(tīng)任務(wù)
     
*/
    
public void start() {
        
        
// 取得當(dāng)前日期時(shí)間
        Date date = new Date();
        
        
// 執(zhí)行自動(dòng)監(jiān)聽(tīng)計(jì)劃
        timer.schedule(new PropertiesTask(this.context), date, sec * 1000);
    }
    
    
/**
     * 停止自動(dòng)監(jiān)聽(tīng)任務(wù)
     
*/
    
public void stop() {
        timer.cancel();

    }

}

自動(dòng)監(jiān)聽(tīng)任務(wù) PropertiesTask

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

import javax.servlet.*;
/**
 * 自動(dòng)監(jiān)聽(tīng)任務(wù)
 * 
@author stephen
 *
 
*/
public class PropertiesTask extends TimerTask {
    
    
private ServletContext context = null;
    
/**
     * 配置文件的最后更新時(shí)間
     
*/
    
private long lastModified = 0;
    
    
/**
     * 構(gòu)造一個(gè)自動(dòng)更新任務(wù)
     * 
@param context
     
*/
    
public PropertiesTask(ServletContext context){
        
this.context = context;
        System.out.println(
"A task instance is created now."); // 任務(wù)在整個(gè) application 周期內(nèi)只創(chuàng)建一次。
    }
    
    
/**
     * 每次執(zhí)行任務(wù)時(shí)顯示一個(gè)隨機(jī)數(shù)。
     
*/
    
public void todoTestRandom(){
        System.out.println(
"Task running");
        context.setAttribute(
"random", String.valueOf(Math.random()));
        System.out.println((String)context.getAttribute(
"random"));
    }
    
    
/**
     * 監(jiān)聽(tīng)配置文件是否被更新。
     
*/
    
public void todoTestFileStatus(){
        System.out.println(
"Getting file status");
        System.out.println(
this.isFileUpdated("WEB-INF/platforms/test.properties"));
    }
    
    
/**
     * 監(jiān)聽(tīng)配置文件是否被更新,自動(dòng)更新文件中的配置項(xiàng)存儲(chǔ)到 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 取配置項(xiàng)的值
     * 
@param key 配置項(xiàng)的鍵名
     * 
@return 配置項(xiàng)的值
     
*/
    
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./xml/ns/j2ee" 
    xmlns:xsi
="http://www./2001/XMLSchema-instance" 
    xsi:schemaLocation
="http://java./xml/ns/j2ee 
    http://java./xml/ns/j2ee/web-app_2_4.xsd"
>
     
<listener>
    
<listener-class>org.stephencat.listener.PropertiesListener</listener-class>
</listener>    
</web-app>

在 WEB-INF 目錄下增加 platforms/test.properties 文件

name=Stephen Wong

啟動(dòng)應(yīng)用服務(wù)器,控制臺(tái)輸出如下:

11:30:31,000 INFO  [TomcatDeployer] undeploy, ctxPath=/ServerTest, warUrl=.../deploy/ServerTest.war/
11:30:31,000 INFO  [[/ServerTest]] Properties listener stop .
11:30:31,000 INFO  [STDOUT] Properties listener stop .
11:30:31,046 INFO  [TomcatDeployer] deploy, ctxPath=/ServerTest, warUrl=.../deploy/ServerTest.war/
11:30:31,359 INFO  [[/ServerTest]] Properties listener start .
11:30:31,359 INFO  [STDOUT] Properties listener start .
11:30:31,375 INFO  [STDOUT] A task instance is created now.
11:30:31,390 INFO  [STDOUT] Task running
11:30:31,390 INFO  [STDOUT] 0.9924364802139768
11:30:31,390 INFO  [STDOUT] The properties file was modified.
11:30:31,390 INFO  [STDOUT] Getting properties
11:30:31,390 INFO  [STDOUT] Test value is: Stephen
11:30:46,390 INFO  [STDOUT] Task running
11:30:46,390 INFO  [STDOUT] 0.24869896604923036
11:30:46,390 INFO  [STDOUT] The properties file was not modified.
11:30:46,390 INFO  [STDOUT] Test value is: Stephen
11:31:01,390 INFO  [STDOUT] Task running
11:31:01,390 INFO  [STDOUT] 0.47994173379307203
11:31:01,390 INFO  [STDOUT] The properties file was not modified.
11:31:01,390 INFO  [STDOUT] Test value is: Stephen
11:31:16,390 INFO  [STDOUT] Task running
11:31:16,390 INFO  [STDOUT] 0.6379331056768383
11:31:16,390 INFO  [STDOUT] The properties file was modified.
11:31:16,390 INFO  [STDOUT] Getting properties
11:31:16,390 INFO  [STDOUT] Test value is: Stephen Wong
11:31:31,390 INFO  [STDOUT] Task running
11:31:31,390 INFO  [STDOUT] 0.30415561271978353
11:31:31,390 INFO  [STDOUT] The properties file was not modified.
11:31:31,390 INFO  [STDOUT] Test value is: Stephen Wong
11:31:46,390 INFO  [STDOUT] Task running
11:31:46,390 INFO  [STDOUT] 0.03696303208126983
11:31:46,390 INFO  [STDOUT] The properties file was not modified.
11:31:46,390 INFO  [STDOUT] Test value is: Stephen Wong

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類(lèi)似文章 更多