Some small refactor

This commit is contained in:
DigitalSonic
2020-02-03 16:48:22 +08:00
parent 8c57759eaa
commit 6b884941fb
5 changed files with 44 additions and 22 deletions
@@ -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());