J2EE社區

          茍有恒,何必三更起五更眠;
          最無益,只怕一日曝十日寒.
          posts - 241, comments - 318, trackbacks - 0, articles - 16

          Java 實現自動監聽并更新配置文件內容

          Posted on 2010-11-05 11:49 xcp 閱讀(3309) 評論(0)  編輯  收藏 所屬分類: JAVA

           

          自動監聽器 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>

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

          name=Stephen Wong

          啟動應用服務器,控制臺輸出如下:

          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








          我自己地例子

          package cn.gov.luzhou.SiteServer.gate.web.filter;

          import javax.servlet.ServletContext;
          import javax.servlet.ServletContextEvent;
          import javax.servlet.ServletContextListener;

          import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;
          import cn.gov.luzhou.SiteServer.gate.buiness.util.AppContext;

          /**
           *
           * @author  向才鵬
           * @version  1.0
           * Copyright (C), 2009,www.soujava.cn所有
           * Program Name:鵬哥偉業
           * Date: Nov 5, 2010 10:41:34 AM
           */
          @SuppressWarnings("unused")
          public class PropertiesListener implements ServletContextListener{
           private SysUserService userSev;
           
              private PropertiesTimer rt = null;
              public void contextInitialized(ServletContextEvent event) {
                  String status = "updatecenter listener start .";
                  event.getServletContext().log(status);
                 
                  ServletContext sc = event.getServletContext();
                  if(sc.getInitParameter("udpateCenterSwitch").equals("open")){
                    userSev = (SysUserService) AppContext.getBean("sysUserService");
                       // 激活自動監聽時鐘
                      rt = new PropertiesTimer(15,sc,userSev);
                      rt.start();
                  }
              }
             
              public void contextDestroyed(ServletContextEvent event) {
                  String status = "updatecenter listener stop .";
                  event.getServletContext().log(status);
                  System.out.println(status);
                 
                  // 停止自動監聽時鐘
                  if (rt != null) {
                      rt.stop();
                  }
                  userSev = null;
              }

             
           public SysUserService getUserSev() {
            return userSev;
           }

           public void setUserSev(SysUserService userSev) {
            this.userSev = userSev;
           }

           public PropertiesTimer getRt() {
            return rt;
           }

           public void setRt(PropertiesTimer rt) {
            this.rt = rt;
           }
          }





          package cn.gov.luzhou.SiteServer.gate.web.filter;

          import java.util.Date;
          import java.util.Timer;

          import javax.servlet.ServletContext;

          import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;


          /**
           *
           * @author  向才鵬
           * @version  1.0
           * Copyright (C), 2009,www.soujava.cn所有
           * Program Name:鵬哥偉業
           * Date: Nov 5, 2010 10:59:46 AM
           */
          public class PropertiesTimer {
           private final Timer timer = new Timer();
              private final int sec;
              private ServletContext context = null;
              private SysUserService userSev = null;
             
              public PropertiesTimer(int seconds, ServletContext context,SysUserService userSev) {
                  sec = seconds;
                  this.context = context;
              }
             
              /**
               * 啟動自動監聽任務
               */
              public void start() {
                 
                  // 取得當前日期時間
                  Date date = new Date();
                 
                  // 執行自動監聽計劃
                  timer.schedule(new PropertiesTask(this.context,userSev), date, sec * 1000);
              }
             
              /**
               * 停止自動監聽任務
               */
              public void stop() {
                  timer.cancel();
                  userSev = null;
              }
          }





          package cn.gov.luzhou.SiteServer.gate.web.filter;

          import java.sql.Timestamp;
          import java.util.Calendar;
          import java.util.TimerTask;

          import javax.servlet.ServletContext;

          import cn.gov.luzhou.SiteServer.gate.buiness.service.SysUserService;
          import cn.gov.luzhou.SiteServer.gate.buiness.util.AppContext;

          public class PropertiesTask extends TimerTask{
           private ServletContext context = null;
           SysUserService userSev = null;
              /**
            * 構造一個自動更新任務
            * @param context
            */
              public PropertiesTask(ServletContext context,SysUserService ttt){
                  this.context = context;
                  if(ttt==null){
                   this.userSev = (SysUserService) AppContext.getBean("sysUserService");
                  }else{
                   this.userSev = ttt;
                  }
              }
             
              public void run() {
                  todoTestRandom();
                  todo();
              }
             
              /**
            * 每次執行任務時顯示一個隨機數。
            */
              public void todoTestRandom(){
                  context.setAttribute("random", String.valueOf(Math.random()));
              }
             
             
              /**
            * 自動更新文件中的配置項存儲到 application 變量中。
            */
              public void todo(){
               Timestamp st = new Timestamp(Calendar.getInstance().getTimeInMillis());
               context.log(st.toString()+"自動更新了數據");
               userSev.updateAll();
              }
          }





          名稱: ?4C.ESL | .↗Evon
          口號: 遇到新問題?先要尋找一個方案乄而不是創造一個方案こ
          mail: 聯系我


          主站蜘蛛池模板: 呈贡县| 昭觉县| 寿光市| 格尔木市| 名山县| 吴川市| 广灵县| 百色市| 景东| 维西| 镇沅| 丽水市| 文山县| 和静县| 襄城县| 东阿县| 永昌县| 崇信县| 友谊县| 兴业县| 博客| 仁布县| 郧西县| 依安县| 阿克苏市| 锡林郭勒盟| 阳城县| 调兵山市| 台南县| 仁化县| 恩平市| 赤城县| 彰化县| 南丹县| 巫山县| 大埔区| 平舆县| 莲花县| 塔城市| 临桂县| 沈阳市|