private static final Logger logger = LoggerFactory.getLogger(SpringStatusChecker.class);
public Status check() {
ApplicationContext context = ServiceBean.getSpringContext();
if (context == null) {
return new Status(Status.Level.UNKNOWN);
}
Status.Level level = Status.Level.OK;
if (context instanceof Lifecycle) {
if (((Lifecycle)context).isRunning()) {
level = Status.Level.OK;
} else {
level = Status.Level.ERROR;
}
} else {
level = Status.Level.UNKNOWN;
}
StringBuilder buf = new StringBuilder();
try {
Class<?> cls = context.getClass();
Method method = null;
while (cls != null && method == null) {
try {
method = cls.getDeclaredMethod("getConfigLocations", new Class<?>[0]);
} catch (NoSuchMethodException t) {
cls = cls.getSuperclass();
}
}
if (method != null) {
if (! method.isAccessible()) {
method.setAccessible(true);
}
String[] configs = (String[]) method.invoke(context, new Object[0]);
if (configs != null && configs.length > 0) {
String dubboConfig = configs[0];
for (String config : configs) {
if (config.contains("dubbo")
|| config.contains("provider")
|| config.contains("server")) {
dubboConfig = config;
break;
}
}
int i = dubboConfig.lastIndexOf('/');
if (i > 0) {
dubboConfig = dubboConfig.substring(i + 1);
}
buf.append(dubboConfig);
}
}
} catch (Throwable t) {
logger.warn(t.getMessage(), t);
}
return new Status(level, buf.toString());
}