一、数据源节点的变更的监听和通知
NodeEventTypeEnum
类定义了两种数据源节点变更事件类型:增加节点、删除节点。NodeEvent
定义数据源节点更新事件的详细信息。
NodeListener
是一个抽象类,负责监听数据源节点信息的改变,并会在 init 方法中,添加 PoolUpdater
作为观察者。
/**
* Add the given PoolUpdater as the Observer.
*
* @see #setObserver(Observer)
*/
public void init() {
if (observer == null) {
throw new DruidRuntimeException("No Observer(such as PoolUpdater) specified.");
}
this.addObserver(observer);
}
// 设置观察者
public void setObserver(Observer observer) {
this.observer = observer;
}
在 HighAvailableDataSource#init()
中调用 createNodeMap() 方法创建数据源节点集合时,便会将数据源节点监听器绑定上观察者——poolUpdater,当 zk 的数据源节点的信息(host/port/database/username/password) 发生更新时,便会通知观察者——poolUpdater,观察者再更新数据源连接池。
private void createNodeMap() {
if (nodeListener == null) {
// Compatiable with the old version.
// Create a FileNodeListener to watch the dataSourceFile.
FileNodeListener listener = new FileNodeListener();
listener.setFile(dataSourceFile);
listener.setPrefix(propertyPrefix);
nodeListener = listener;
}
// 设置观察者为:负责更新数据源连接池的——poolUpdater
nodeListener.setObserver(poolUpdater);
nodeListener.init();
// 当zk的数据源节点信息发生更新时,通知观察者——poolUpdater
nodeListener.update(); // Do update in the current Thread at the startup
}
二、小结
数据源节点的变更的监听和通知,是一个观察者模式,可以及时的感知 zk 中数据源节点信息的变更。