可以先阅读 使用观察者模式监听Map值的改变
1. 数据库表 sys_params
数据库为: oracle 10g2
create table SYS_PARAMS
(
PARAM_ID VARCHAR2(36) PRIMARY KEY,
PARAM_NAME VARCHAR2(20) not null,
PARAM_VALUE VARCHAR2(20) not null,
PARAM_DESC VARCHAR2(100)
);
INSERT INTO SYS_PARAMS
VALUES
(SYS_GUID(),
'a定时任务时间',
TO_CHAR(SYSDATE, 'yyyy-MM-dd HH24:mi:ss'),
'');
COMMIT;
2. 实体类 SysParamsPO, 实体类即为观察者对象
import java.util.Observable;
import java.util.Observer;
public class SysParamsPO implements Observer {
// 主键
private String paramId;
// 系统参数名
private String paramName;
// 系统参数值
private String paramValue;
// 描述
private String paramDesc;
@Override
public void update(Observable o, Object arg) {
System.out.println("update:" + arg);
}
// 省略 getter()/setter()
}
3. 定义一个全局Map,用来存放系统参数
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
public final class CommonConstants {
private CommonConstants() {
}
/** 系统参数 */
public static Map<String, Object> sysParamsMap = new ConcurrentHashMap<String, Object>(16);
}
4. 在servlet的init()方法中查找表 SYS_PARAMS 的数据,存入CommonConstants.sysParamsMap中
(这里就不写了,比较简单)
5. 定义一个被观察者对象(Observable),用来监控对系统参数的新增
import java.util.Iterator;
import java.util.Map;
import java.util.Observable;
import java.util.Observer;
import java.util.concurrent.ConcurrentHashMap;
public final class SysParamsObservable extends Observable {
private static final SysParamsObservable instance = new SysParamsObservable();
protected Map<String, Object> obs = new ConcurrentHashMap<String, Object>();
private SysParamsObservable() {
}
public static SysParamsObservable getInstance() {
return instance;
}
/**
* @Title: doBusiness
* @Description: 当被观察者有Changed时,通知观察者
* @param arg
* @author
* @date 2013-5-2
*/
public void doBusiness(Object arg) {
// 设置修改状态
super.setChanged();
// 通知观察者
this.notifyObservers(arg);
}
/**
* @Title: notifyObservers
* @Description: 模仿不同的业务通知对应业务的观察者
* @param arg
* @see java.util.Observable#notifyObservers(java.lang.Object)
* @author
*/
public void notifyObservers(Object arg) {
String msg = arg.toString();
String[] msgs = msg.split(":");
if (obs.containsKey(msgs[0])) {
Observer ob = (Observer) obs.get(msgs[0]);
ob.update(this, msgs[1]);
}
}
/**
* @Title: addObserver
* @Description: 添加一个观察者
* @param name
* 观察者名称
* @param o
* 观察者对象
* @author
* @date 2013-5-2
*/
public synchronized void addObserver(SysParamsPO po) {
System.out.println("添加一个系统参数:" + po.getParamName());
CommonConstants.sysParamsMap.put(po.getParamName(), po.getParamValue());
}
/**
* @Title: updateObserver
* @Description: 修改一个观察者
* @param name
* 观察者名称
* @param o
* :观察者对象
* @author
* @date 2013-5-2
*/
public synchronized void updateObserver(String name, Observer o) {
Iterator<String> it = obs.keySet().iterator();
String key = null;
while (it.hasNext()) {
key = it.next();
if (key.equals(name)) {
System.out.println("被修改的key为:" + key);
obs.put(key, o);
break;
}
}
}
/**
* @Title: deleteObserver
* @Description: 删除观察者
* @param o
* : 观察者对象
* @see java.util.Observable#deleteObserver(java.util.Observer)
* @author
*/
public synchronized void deleteObserver(Observer o) {
if (obs.values().contains(o)) {
Iterator<String> it = obs.keySet().iterator();
String key = null;
while (it.hasNext()) {
key = it.next();
if (obs.get(key).equals(o)) {
System.out.println("被删除的key为:" + key);
obs.remove(key);
break;
}
}
}
}
}
其中的方法addObserver,即为监控新增操作的方法。
6. service层方法
先插入数据库中,再放入CommonConstants.sysParamsMap中
public void add(SysParamsPO po) throws Exception {
po.setParamId(UUID.randomUUID().toString());
sysparamsDAO.insert(po);
// 实例化一个被观察者
SysParamsObservable able = SysParamsObservable.getInstance();
// 添加观察者
able.addObserver(po);
logger.info("添加后,系统参数为:" + CommonConstants.sysParamsMap);
}
7. action 层方法(Struts2框架)
public void addSysParamsPO() {
try {
sysparamsService.add(sysParamsPO);
} catch (Exception e) {
e.printStackTrace();
}
}
8. 新增系统参数页面
运行结果:
添加一个系统参数:a11
2013-05-07 15:13:36,069 [INFO] cn.com.do1.component.sysparams.sysparams.service.impl.SysparamsServiceImpl.add(SysparamsServiceImpl.java:107) 添加后,系统参数为:{a11=1.1, a定时任务时间=2013-05-07 15:11:01}
数据库数据 :