Add a CommandCenterProvider to resolve and cache the CommandCenter instance (#409)

This commit is contained in:
cdfive 2019-03-04 17:34:41 +08:00 committed by Eric Zhao
parent b54461b058
commit 61fede3827
2 changed files with 48 additions and 15 deletions

View File

@ -0,0 +1,37 @@
package com.alibaba.csp.sentinel.command;
import com.alibaba.csp.sentinel.log.RecordLog;
import com.alibaba.csp.sentinel.transport.CommandCenter;
import com.alibaba.csp.sentinel.util.SpiLoader;
/**
* Provider for a universal {@link CommandCenter} instance.
*
* @author cdfive
* @date 2019-01-11
*/
public class CommandCenterProvider {
private static CommandCenter commandCenter = null;
static {
resolveInstance();
}
private static void resolveInstance() {
CommandCenter resolveCommandCenter = SpiLoader.loadFirstInstance(CommandCenter.class);
if (resolveCommandCenter == null) {
RecordLog.warn("[CommandCenterProvider] No existing CommandCenter, resolve failed");
} else {
commandCenter = resolveCommandCenter;
RecordLog.info("[CommandCenterProvider] CommandCenter resolved: " + resolveCommandCenter.getClass().getCanonicalName());
}
}
public static CommandCenter getCommandCenter() {
return commandCenter;
}
private CommandCenterProvider() {}
}

View File

@ -15,9 +15,7 @@
*/
package com.alibaba.csp.sentinel.transport.init;
import java.util.Iterator;
import java.util.ServiceLoader;
import com.alibaba.csp.sentinel.command.CommandCenterProvider;
import com.alibaba.csp.sentinel.init.InitFunc;
import com.alibaba.csp.sentinel.init.InitOrder;
import com.alibaba.csp.sentinel.log.RecordLog;
@ -31,18 +29,16 @@ public class CommandCenterInitFunc implements InitFunc {
@Override
public void init() throws Exception {
ServiceLoader<CommandCenter> loader = ServiceLoader.load(CommandCenter.class);
Iterator<CommandCenter> iterator = loader.iterator();
if (iterator.hasNext()) {
CommandCenter commandCenter = iterator.next();
if (iterator.hasNext()) {
throw new IllegalStateException("Only single command center can be started");
} else {
commandCenter.beforeStart();
commandCenter.start();
RecordLog.info("[CommandCenterInit] Starting command center: "
+ commandCenter.getClass().getCanonicalName());
}
CommandCenter commandCenter = CommandCenterProvider.getCommandCenter();
if (commandCenter == null) {
RecordLog.warn("[CommandCenterInitFunc] Cannot resolve CommandCenter");
return;
}
commandCenter.beforeStart();
commandCenter.start();
RecordLog.info("[CommandCenterInit] Starting command center: "
+ commandCenter.getClass().getCanonicalName());
}
}