自动监听器 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