自動(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 文件 ![]() ![]() 啟動(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 |
|
來(lái)自: CevenCheng > 《監(jiān)聽(tīng)文件》