diff --git a/src/main/java/org/redkale/source/AbstractCacheSource.java b/src/main/java/org/redkale/source/AbstractCacheSource.java index 66ff6f84b..726ddbf39 100644 --- a/src/main/java/org/redkale/source/AbstractCacheSource.java +++ b/src/main/java/org/redkale/source/AbstractCacheSource.java @@ -18,7 +18,7 @@ import org.redkale.util.*; @AutoLoad(false) @SuppressWarnings("unchecked") @ResourceType(CacheSource.class) -public abstract class AbstractCacheSource extends AbstractService implements CacheSource, AutoCloseable, Resourcable { +public abstract class AbstractCacheSource extends AbstractService implements CacheSource, AutoCloseable, Resourcable, SourceChangeable { //@since 2.7.0 public static final String CACHE_SOURCE_URL = "url"; diff --git a/src/main/java/org/redkale/source/AbstractDataSource.java b/src/main/java/org/redkale/source/AbstractDataSource.java index 19658fcb5..1eb032e42 100644 --- a/src/main/java/org/redkale/source/AbstractDataSource.java +++ b/src/main/java/org/redkale/source/AbstractDataSource.java @@ -30,7 +30,7 @@ import org.redkale.util.*; @AutoLoad(false) @SuppressWarnings("unchecked") @ResourceType(DataSource.class) -public abstract class AbstractDataSource extends AbstractService implements DataSource, AutoCloseable, Resourcable { +public abstract class AbstractDataSource extends AbstractService implements DataSource, AutoCloseable, Resourcable, SourceChangeable { //@since 2.7.0 格式: x.x.x.x:yyyy public static final String DATA_SOURCE_PROXY_ADDRESS = "proxy-address"; diff --git a/src/main/java/org/redkale/source/CacheMemorySource.java b/src/main/java/org/redkale/source/CacheMemorySource.java index ff3faf97d..983aae9b8 100644 --- a/src/main/java/org/redkale/source/CacheMemorySource.java +++ b/src/main/java/org/redkale/source/CacheMemorySource.java @@ -62,6 +62,10 @@ public final class CacheMemorySource extends AbstractCacheSource { return "memory"; } + @Override + public void onChange(ResourceEvent[] events) { + } + public static boolean acceptsConf(AnyValue config) { return config.getValue(CACHE_SOURCE_URL).startsWith("memory:"); } diff --git a/src/main/java/org/redkale/source/DataJdbcSource.java b/src/main/java/org/redkale/source/DataJdbcSource.java index 4f6d1bc4a..2408a20fa 100644 --- a/src/main/java/org/redkale/source/DataJdbcSource.java +++ b/src/main/java/org/redkale/source/DataJdbcSource.java @@ -48,6 +48,11 @@ public class DataJdbcSource extends DataSqlSource { } } + @Override + public void onChange(ResourceEvent[] events) { + + } + @Override public void destroy(AnyValue config) { if (readPool != null) readPool.close(); @@ -1079,7 +1084,7 @@ public class DataJdbcSource extends DataSqlSource { }; } - protected class ConnectionPool implements AutoCloseable { + protected class ConnectionPool implements AutoCloseable, SourceChangeable { protected final LongAdder closeCounter = new LongAdder(); //已关闭连接数 @@ -1095,7 +1100,7 @@ public class DataJdbcSource extends DataSqlSource { protected final Properties connectAttrs; - protected final ArrayBlockingQueue queue; + protected ArrayBlockingQueue queue; protected int connectTimeoutSeconds; @@ -1120,6 +1125,23 @@ public class DataJdbcSource extends DataSqlSource { } } + @Override + public void onChange(ResourceEvent[] events) { + for (ResourceEvent event : events) { + if (event.name().equals(DATA_SOURCE_CONNECTTIMEOUT_SECONDS) || event.name().endsWith("." + DATA_SOURCE_CONNECTTIMEOUT_SECONDS)) { + this.connectTimeoutSeconds = Integer.decode(event.newValue().toString()); + } else if (event.name().equals(DATA_SOURCE_URL) || event.name().endsWith("." + DATA_SOURCE_URL)) { + this.url = event.newValue().toString(); + } else if (event.name().equals(DATA_SOURCE_USER) || event.name().endsWith("." + DATA_SOURCE_USER)) { + this.connectAttrs.put("user", event.newValue().toString()); + } else if (event.name().equals(DATA_SOURCE_PASSWORD) || event.name().endsWith("." + DATA_SOURCE_PASSWORD)) { + this.connectAttrs.put("password", event.newValue().toString()); + } else if (event.name().equals(DATA_SOURCE_MAXCONNS) || event.name().endsWith("." + DATA_SOURCE_MAXCONNS)) { + logger.log(Level.WARNING, event.name() + " (new-value: " + event.newValue() + ") will not take effect"); + } + } + } + public synchronized Connection pollConnection() { Connection conn = queue.poll(); if (conn == null) { diff --git a/src/main/java/org/redkale/source/DataMemorySource.java b/src/main/java/org/redkale/source/DataMemorySource.java index 6308c3aed..3bd17cb4c 100644 --- a/src/main/java/org/redkale/source/DataMemorySource.java +++ b/src/main/java/org/redkale/source/DataMemorySource.java @@ -43,6 +43,10 @@ public class DataMemorySource extends DataSqlSource implements SearchSource { return "memory"; } + @Override + public void onChange(ResourceEvent[] events) { + } + public static boolean acceptsConf(AnyValue config) { return config.getValue(DATA_SOURCE_URL).startsWith("memory:"); } @@ -56,8 +60,8 @@ public class DataMemorySource extends DataSqlSource implements SearchSource { return getClass().getSimpleName() + "{type=memory, name='" + resourceName() + "'}"; } - @Override @Local + @Override public void compile(Class clazz) { EntityInfo entityInfo = EntityInfo.compile(clazz, this); if (entityInfo.getCache() == null) new EntityCache<>(entityInfo, null).clear(); diff --git a/src/main/java/org/redkale/source/DataSqlSource.java b/src/main/java/org/redkale/source/DataSqlSource.java index 80969310f..be03648f2 100644 --- a/src/main/java/org/redkale/source/DataSqlSource.java +++ b/src/main/java/org/redkale/source/DataSqlSource.java @@ -150,6 +150,10 @@ public abstract class DataSqlSource extends AbstractDataSource implements Functi } } + @Override + public void onChange(ResourceEvent[] events) { + } + @Override public String toString() { if (readConfProps == null) return getClass().getSimpleName() + "{}"; //compileMode模式下会为null diff --git a/src/main/java/org/redkale/source/SourceChangeable.java b/src/main/java/org/redkale/source/SourceChangeable.java new file mode 100644 index 000000000..aa56aaaac --- /dev/null +++ b/src/main/java/org/redkale/source/SourceChangeable.java @@ -0,0 +1,22 @@ +/* + * + */ +package org.redkale.source; + +import org.redkale.util.ResourceEvent; + +/** + * 资源变更回调接口 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * + * @since 2.8.0 + */ +public interface SourceChangeable { + + public void onChange(ResourceEvent[] events); + +}