自动监听器 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./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 文件 ![]() ![]() 启动应用服务器,控制台输出如下: 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 |
|
来自: CevenCheng > 《监听文件》