这篇博客是记一次故障的总结。
故障的原因是发布完了修改配置文件的时候,配置属性转换类型失败,导致线上商品全部不展示。
故障部分关键代码:
if (StringUtils.isNumeric(value)) {
confMap.put(key, Integer.valueOf(value))
}
配置的时候value没有配,传入了一个空串""
,然后StringUtils.isNumeric
没有进行数字校验,导致Integer.valueOf(value)
的时候报错。
public static boolean isNumeric(String str) {
if (str == null) {
return false;
} else {
int sz = str.length();
// 空串长度为0,不进行校验
for(int i = 0; i < sz; ++i) {
if (!Character.isDigit(str.charAt(i))) {
return false;
}
}
return true;
}
}
经过这次教训,我们的优化方案是加载配置文件的时候把需要转换类型的属性直接进行转换,存到内存中,这样即使配置错误,一样可以使用原来的配置文件:
public static void onChange(Map<String, String> conf) {
try {
Map<String, Integer> temp = Maps.newHashMap();
for (Map.Entry<String, String> entry : conf.entrySet()) {
String key = entry.getKey();
String value = entry.getValue();
if (StringUtils.isNotEmpty(value) && StringUtils.isNumeric(value)) {
temp.put(key, Integer.valueOf(value));
} else {
throw new IllegalArgumentException(String.format("属性配置错误,key=%s,value=%s", entry.getKey(), entry.getValue()));
}
}
configMap = temp;
} catch (Exception e) {
log.error("加载配置文件失败", e);
}
}