diff --git a/src/main/java/com/alibaba/druid/pool/ha/PropertiesUtils.java b/src/main/java/com/alibaba/druid/pool/ha/PropertiesUtils.java index 337a589427..06ad20928e 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/PropertiesUtils.java +++ b/src/main/java/com/alibaba/druid/pool/ha/PropertiesUtils.java @@ -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; + } } diff --git a/src/main/java/com/alibaba/druid/pool/ha/node/FileNodeListener.java b/src/main/java/com/alibaba/druid/pool/ha/node/FileNodeListener.java index 6005135d49..2bc1b9cef2 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/node/FileNodeListener.java +++ b/src/main/java/com/alibaba/druid/pool/ha/node/FileNodeListener.java @@ -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 events = NodeEvent.getEventListFromProperties(getProperties(), properties); + List events = NodeEvent.getEventsByDiffProperties(getProperties(), properties); if (events != null && !events.isEmpty()) { setProperties(properties); } diff --git a/src/main/java/com/alibaba/druid/pool/ha/node/NodeEvent.java b/src/main/java/com/alibaba/druid/pool/ha/node/NodeEvent.java index 78edb08e65..51f7b3293f 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/node/NodeEvent.java +++ b/src/main/java/com/alibaba/druid/pool/ha/node/NodeEvent.java @@ -38,7 +38,7 @@ public class NodeEvent { * * @return A List of AddEvent and DelEvent */ - public static List getEventListFromProperties(Properties previous, Properties next) { + public static List getEventsByDiffProperties(Properties previous, Properties next) { List prevNames = PropertiesUtils.loadNameList(previous, ""); List nextNames = PropertiesUtils.loadNameList(next, ""); @@ -62,7 +62,7 @@ public class NodeEvent { return list; } - private static List generateEvents(Properties properties, List names, NodeEventTypeEnum type) { + public static List generateEvents(Properties properties, List names, NodeEventTypeEnum type) { List list = new ArrayList(); for (String n : names) { NodeEvent event = new NodeEvent(); diff --git a/src/main/java/com/alibaba/druid/pool/ha/node/NodeListener.java b/src/main/java/com/alibaba/druid/pool/ha/node/NodeListener.java index f91b90c056..f9250ac7e3 100644 --- a/src/main/java/com/alibaba/druid/pool/ha/node/NodeListener.java +++ b/src/main/java/com/alibaba/druid/pool/ha/node/NodeListener.java @@ -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 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 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); } } diff --git a/src/test/java/com/alibaba/druid/pool/ha/node/NodeEventTest.java b/src/test/java/com/alibaba/druid/pool/ha/node/NodeEventTest.java index 1ad4bf03aa..f24ed7f535 100644 --- a/src/test/java/com/alibaba/druid/pool/ha/node/NodeEventTest.java +++ b/src/test/java/com/alibaba/druid/pool/ha/node/NodeEventTest.java @@ -14,14 +14,14 @@ public class NodeEventTest { Properties p1 = new Properties(); Properties p2 = new Properties(); - List list = NodeEvent.getEventListFromProperties(p1, p2); + List 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());