Parcourir la source

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

master
cdfive Eric Zhao il y a 5 ans
Parent
révision
61fede3827
2 fichiers modifiés avec 48 ajouts et 15 suppressions
  1. +37
    -0
      sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/CommandCenterProvider.java
  2. +11
    -15
      sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/init/CommandCenterInitFunc.java

+ 37
- 0
sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/command/CommandCenterProvider.java Voir le fichier

@@ -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() {}
}

+ 11
- 15
sentinel-transport/sentinel-transport-common/src/main/java/com/alibaba/csp/sentinel/transport/init/CommandCenterInitFunc.java Voir le fichier

@@ -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());
}
}

Chargement…
Annuler
Enregistrer