自动监听器 PropertiesListener
自动监听时钟 PropertiesTimer
自动监听任务 PropertiesTask
web.xml 配置
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();
}
}
}
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();
}
}
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);
}
}
}
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-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 >