mirror of
https://github.com/alibaba/druid.git
synced 2023-03-04 19:17:16 +00:00
Some small refactor
This commit is contained in:
@@ -17,6 +17,7 @@ package com.alibaba.druid.pool.ha;
|
||||
|
||||
import com.alibaba.druid.support.logging.Log;
|
||||
import com.alibaba.druid.support.logging.LogFactory;
|
||||
import com.alibaba.druid.util.StringUtils;
|
||||
|
||||
import java.io.FileInputStream;
|
||||
import java.io.FileNotFoundException;
|
||||
@@ -98,4 +99,17 @@ public class PropertiesUtils {
|
||||
}
|
||||
return nameList;
|
||||
}
|
||||
|
||||
public static Properties filterPrefix(Properties properties, String prefix) {
|
||||
if (properties == null || prefix == null || prefix.isEmpty()) {
|
||||
return properties;
|
||||
}
|
||||
Properties result = new Properties();
|
||||
for (String n : properties.stringPropertyNames()) {
|
||||
if (n.startsWith(prefix)) {
|
||||
result.setProperty(n, properties.getProperty(n));
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,6 +24,8 @@ import java.util.Properties;
|
||||
import java.util.concurrent.Executors;
|
||||
import java.util.concurrent.ScheduledExecutorService;
|
||||
import java.util.concurrent.TimeUnit;
|
||||
import java.util.concurrent.locks.Lock;
|
||||
import java.util.concurrent.locks.ReentrantLock;
|
||||
|
||||
/**
|
||||
* A NodeList that monitors the change of a file.
|
||||
@@ -33,6 +35,7 @@ import java.util.concurrent.TimeUnit;
|
||||
public class FileNodeListener extends NodeListener {
|
||||
private final static Log LOG = LogFactory.getLog(FileNodeListener.class);
|
||||
|
||||
private Lock lock = new ReentrantLock();
|
||||
private String file = null;
|
||||
private String prefix = "";
|
||||
private int intervalSeconds = 60;
|
||||
@@ -54,10 +57,16 @@ public class FileNodeListener extends NodeListener {
|
||||
executor.scheduleAtFixedRate(new Runnable() {
|
||||
@Override
|
||||
public void run() {
|
||||
if (!lock.tryLock()) {
|
||||
LOG.info("Can not acquire the lock, skip this time.");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
update();
|
||||
} catch (Exception e) {
|
||||
LOG.error("Can NOT update the node list.", e);
|
||||
} finally {
|
||||
lock.unlock();
|
||||
}
|
||||
}
|
||||
}, intervalSeconds, intervalSeconds, TimeUnit.SECONDS);
|
||||
@@ -95,7 +104,7 @@ public class FileNodeListener extends NodeListener {
|
||||
}
|
||||
}
|
||||
|
||||
List<NodeEvent> events = NodeEvent.getEventListFromProperties(getProperties(), properties);
|
||||
List<NodeEvent> events = NodeEvent.getEventsByDiffProperties(getProperties(), properties);
|
||||
if (events != null && !events.isEmpty()) {
|
||||
setProperties(properties);
|
||||
}
|
||||
|
||||
@@ -38,7 +38,7 @@ public class NodeEvent {
|
||||
*
|
||||
* @return A List of AddEvent and DelEvent
|
||||
*/
|
||||
public static List<NodeEvent> getEventListFromProperties(Properties previous, Properties next) {
|
||||
public static List<NodeEvent> getEventsByDiffProperties(Properties previous, Properties next) {
|
||||
List<String> prevNames = PropertiesUtils.loadNameList(previous, "");
|
||||
List<String> nextNames = PropertiesUtils.loadNameList(next, "");
|
||||
|
||||
@@ -62,7 +62,7 @@ public class NodeEvent {
|
||||
return list;
|
||||
}
|
||||
|
||||
private static List<NodeEvent> generateEvents(Properties properties, List<String> names, NodeEventTypeEnum type) {
|
||||
public static List<NodeEvent> generateEvents(Properties properties, List<String> names, NodeEventTypeEnum type) {
|
||||
List<NodeEvent> list = new ArrayList<NodeEvent>();
|
||||
for (String n : names) {
|
||||
NodeEvent event = new NodeEvent();
|
||||
|
||||
@@ -66,25 +66,24 @@ public abstract class NodeListener extends Observable {
|
||||
* Fire the refresh() method and notify the Observer.
|
||||
*
|
||||
* @see #refresh()
|
||||
* @see #update(List)
|
||||
*/
|
||||
public void update() {
|
||||
if (!lock.tryLock()) {
|
||||
LOG.info("Can not acquire the lock, skip this time.");
|
||||
return;
|
||||
}
|
||||
try {
|
||||
List<NodeEvent> events = refresh();
|
||||
if (events != null && !events.isEmpty()) {
|
||||
this.lastUpdateTime = new Date();
|
||||
NodeEvent[] arr = new NodeEvent[events.size()];
|
||||
for (int i = 0; i < events.size(); i++) {
|
||||
arr[i] = events.get(i);
|
||||
}
|
||||
this.setChanged();
|
||||
this.notifyObservers(arr);
|
||||
update(refresh());
|
||||
}
|
||||
|
||||
/**
|
||||
* Notify the Observer.
|
||||
*/
|
||||
public void update(List<NodeEvent> events) {
|
||||
if (events != null && !events.isEmpty()) {
|
||||
this.lastUpdateTime = new Date();
|
||||
NodeEvent[] arr = new NodeEvent[events.size()];
|
||||
for (int i = 0; i < events.size(); i++) {
|
||||
arr[i] = events.get(i);
|
||||
}
|
||||
} finally {
|
||||
lock.unlock();
|
||||
this.setChanged();
|
||||
this.notifyObservers(arr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -14,14 +14,14 @@ public class NodeEventTest {
|
||||
Properties p1 = new Properties();
|
||||
Properties p2 = new Properties();
|
||||
|
||||
List<NodeEvent> list = NodeEvent.getEventListFromProperties(p1, p2);
|
||||
List<NodeEvent> list = NodeEvent.getEventsByDiffProperties(p1, p2);
|
||||
assertTrue(list.isEmpty());
|
||||
|
||||
p1.setProperty("foo.url", "foo_url");
|
||||
p1.setProperty("foo.username", "foo_username");
|
||||
p1.setProperty("foo.password", "foo_password");
|
||||
|
||||
list = NodeEvent.getEventListFromProperties(p1, p2);
|
||||
list = NodeEvent.getEventsByDiffProperties(p1, p2);
|
||||
assertEquals(1, list.size());
|
||||
NodeEvent event = list.get(0);
|
||||
assertEquals(NodeEventTypeEnum.DELETE, event.getType());
|
||||
@@ -30,7 +30,7 @@ public class NodeEventTest {
|
||||
assertEquals("foo_username", event.getUsername());
|
||||
assertEquals("foo_password", event.getPassword());
|
||||
|
||||
list = NodeEvent.getEventListFromProperties(p2, p1);
|
||||
list = NodeEvent.getEventsByDiffProperties(p2, p1);
|
||||
assertEquals(1, list.size());
|
||||
event = list.get(0);
|
||||
assertEquals(NodeEventTypeEnum.ADD, event.getType());
|
||||
|
||||
Reference in New Issue
Block a user