diff --git a/src/main/java/module-info.java b/src/main/java/module-info.java index 772e0892b..06456620b 100644 --- a/src/main/java/module-info.java +++ b/src/main/java/module-info.java @@ -41,10 +41,12 @@ module org.redkale { exports org.redkale.watch; uses org.redkale.boot.PropertiesAgentProvider; + uses org.redkale.cache.spi.CacheManagerProvider; uses org.redkale.cluster.ClusterAgentProvider; uses org.redkale.convert.ConvertProvider; uses org.redkale.inject.ResourceAnnotationProvider; uses org.redkale.mq.MessageAgentProvider; + uses org.redkale.schedule.spi.ScheduleManagerProvider; uses org.redkale.source.CacheSourceProvider; uses org.redkale.source.DataSourceProvider; uses org.redkale.source.DataNativeSqlParserProvider; diff --git a/src/main/java/org/redkale/cache/spi/CacheManagerProvider.java b/src/main/java/org/redkale/cache/spi/CacheManagerProvider.java new file mode 100644 index 000000000..915978c01 --- /dev/null +++ b/src/main/java/org/redkale/cache/spi/CacheManagerProvider.java @@ -0,0 +1,21 @@ +/* + * + */ +package org.redkale.cache.spi; + +import org.redkale.cache.CacheManager; +import org.redkale.util.InstanceProvider; + +/** + * + * 自定义的CacheManager加载器, 如果标记@Priority加载器的优先级需要大于1000, 1000以下预留给官方加载器 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.8.0 + */ +public interface CacheManagerProvider extends InstanceProvider { + +} diff --git a/src/main/java/org/redkale/cache/spi/CacheManagerService.java b/src/main/java/org/redkale/cache/spi/CacheManagerService.java index acbd7f36f..3197b7f2c 100644 --- a/src/main/java/org/redkale/cache/spi/CacheManagerService.java +++ b/src/main/java/org/redkale/cache/spi/CacheManagerService.java @@ -87,10 +87,6 @@ public class CacheManagerService implements CacheManager, Service { return this; } - public AnyValue getConfig() { - return config; - } - @Override public void init(AnyValue conf) { this.config = conf; diff --git a/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java b/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java index 50c43cdb7..f1fa91693 100644 --- a/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java +++ b/src/main/java/org/redkale/cache/spi/CacheModuleEngine.java @@ -3,10 +3,17 @@ */ package org.redkale.cache.spi; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; import org.redkale.boot.Application; import org.redkale.boot.ModuleEngine; import org.redkale.cache.CacheManager; +import org.redkale.service.Service; import org.redkale.util.AnyValue; +import org.redkale.util.InstanceProvider; +import org.redkale.util.RedkaleClassLoader; /** * @@ -15,7 +22,9 @@ import org.redkale.util.AnyValue; public class CacheModuleEngine extends ModuleEngine { //全局缓存管理器 - private CacheManagerService cacheManager; + private CacheManager cacheManager; + + private AnyValue config; public CacheModuleEngine(Application application) { super(application); @@ -42,13 +51,16 @@ public class CacheModuleEngine extends ModuleEngine { /** * 结束Application.init方法前被调用 */ + @Override public void onAppPostInit() { //设置缓存管理器 - this.cacheManager = CacheManagerService.create(null).enabled(false); - final AnyValue cacheConf = application.getAppConfig().getAnyValue("cache"); - if (cacheConf != null && !application.isCompileMode()) { + this.config = application.getAppConfig().getAnyValue("cache"); + this.cacheManager = createManager(this.config); + if (this.config != null && !application.isCompileMode()) { this.resourceFactory.inject(this.cacheManager); - this.cacheManager.init(cacheConf); + if (this.cacheManager instanceof Service) { + ((Service) this.cacheManager).init(this.config); + } } this.resourceFactory.register("", CacheManager.class, this.cacheManager); } @@ -56,9 +68,27 @@ public class CacheModuleEngine extends ModuleEngine { /** * 进入Application.shutdown方法被调用 */ + @Override public void onAppPreShutdown() { - if (!application.isCompileMode()) { - this.cacheManager.destroy(this.cacheManager.getConfig()); + if (!application.isCompileMode() && this.cacheManager instanceof Service) { + ((Service) this.cacheManager).destroy(this.config); } } + + private CacheManager createManager(AnyValue conf) { + Iterator it = ServiceLoader.load(CacheManagerProvider.class, application.getClassLoader()).iterator(); + RedkaleClassLoader.putServiceLoader(CacheManagerProvider.class); + List providers = new ArrayList<>(); + while (it.hasNext()) { + CacheManagerProvider provider = it.next(); + if (provider != null && provider.acceptsConf(conf)) { + RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); + providers.add(provider); + } + } + for (CacheManagerProvider provider : InstanceProvider.sort(providers)) { + return provider.createInstance(); + } + return CacheManagerService.create(null).enabled(false); + } } diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleManagerProvider.java b/src/main/java/org/redkale/schedule/spi/ScheduleManagerProvider.java new file mode 100644 index 000000000..f449cc157 --- /dev/null +++ b/src/main/java/org/redkale/schedule/spi/ScheduleManagerProvider.java @@ -0,0 +1,21 @@ +/* + * + */ +package org.redkale.schedule.spi; + +import org.redkale.schedule.ScheduleManager; +import org.redkale.util.InstanceProvider; + +/** + * + * 自定义的ScheduleManager加载器, 如果标记@Priority加载器的优先级需要大于1000, 1000以下预留给官方加载器 + * + *

+ * 详情见: https://redkale.org + * + * @author zhangjx + * @since 2.8.0 + */ +public interface ScheduleManagerProvider extends InstanceProvider { + +} diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java index 759b8da96..c36463898 100644 --- a/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java +++ b/src/main/java/org/redkale/schedule/spi/ScheduleManagerService.java @@ -94,10 +94,6 @@ public class ScheduleManagerService implements ScheduleManager, Service { return this; } - public AnyValue getConfig() { - return config; - } - @Override public void init(AnyValue conf) { if (conf == null) { diff --git a/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java b/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java index d01920cdf..ac2c6e7a1 100644 --- a/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java +++ b/src/main/java/org/redkale/schedule/spi/ScheduleModuleEngine.java @@ -3,11 +3,17 @@ */ package org.redkale.schedule.spi; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; +import java.util.ServiceLoader; import org.redkale.boot.Application; import org.redkale.boot.ModuleEngine; import org.redkale.schedule.ScheduleManager; import org.redkale.service.Service; import org.redkale.util.AnyValue; +import org.redkale.util.InstanceProvider; +import org.redkale.util.RedkaleClassLoader; /** * @@ -16,7 +22,10 @@ import org.redkale.util.AnyValue; public class ScheduleModuleEngine extends ModuleEngine { //全局定时任务管理器 - private ScheduleManagerService scheduleManager; + private ScheduleManager scheduleManager; + + //配置 + protected AnyValue config; public ScheduleModuleEngine(Application application) { super(application); @@ -43,13 +52,16 @@ public class ScheduleModuleEngine extends ModuleEngine { /** * 结束Application.init方法前被调用 */ + @Override public void onAppPostInit() { //设置定时管理器 - this.scheduleManager = ScheduleManagerService.create(null).enabled(false); - final AnyValue scheduleConf = application.getAppConfig().getAnyValue("schedule"); - if (scheduleConf != null && !application.isCompileMode()) { + this.config = application.getAppConfig().getAnyValue("schedule"); + this.scheduleManager = createManager(this.config); + if (this.config != null && !application.isCompileMode()) { this.resourceFactory.inject(this.scheduleManager); - this.scheduleManager.init(scheduleConf); + if (this.scheduleManager instanceof Service) { + ((Service) this.scheduleManager).init(this.config); + } } this.resourceFactory.register("", ScheduleManager.class, this.scheduleManager); } @@ -59,6 +71,7 @@ public class ScheduleModuleEngine extends ModuleEngine { * * @param service Service */ + @Override public void onServicePostInit(Service service) { this.scheduleManager.schedule(service); } @@ -76,9 +89,27 @@ public class ScheduleModuleEngine extends ModuleEngine { /** * 进入Application.shutdown方法被调用 */ + @Override public void onAppPreShutdown() { - if (!application.isCompileMode()) { - this.scheduleManager.destroy(this.scheduleManager.getConfig()); + if (!application.isCompileMode() && this.scheduleManager instanceof Service) { + ((Service) this.scheduleManager).destroy(this.config); } } + + private ScheduleManager createManager(AnyValue conf) { + Iterator it = ServiceLoader.load(ScheduleManagerProvider.class, application.getClassLoader()).iterator(); + RedkaleClassLoader.putServiceLoader(ScheduleManagerProvider.class); + List providers = new ArrayList<>(); + while (it.hasNext()) { + ScheduleManagerProvider provider = it.next(); + if (provider != null && provider.acceptsConf(conf)) { + RedkaleClassLoader.putReflectionPublicConstructors(provider.getClass(), provider.getClass().getName()); + providers.add(provider); + } + } + for (ScheduleManagerProvider provider : InstanceProvider.sort(providers)) { + return provider.createInstance(); + } + return ScheduleManagerService.create(null).enabled(false); + } }