可以先閱讀 使用觀察者模式監聽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}
資料庫資料 :