来源:Kelanss 发布时间:2018-12-08 15:02:40 阅读量:1081
今天遇到三个测试提过来的问题
1、测试新上传的图片获取不到,返回的图片名称也是null -----图片服务器挂了
原因开发环境的图片服务器挂了
2、测试新建模板的时候失败----服务器没有启动相关服务
经过排查原因测试环境的mongo服务器没有启动我们项目mongo表对应的服务
我的处理办法:先切换到测试环境进行测试确实存在这个问题,后来启动我本地进行测试,我本地是好的,说明是测试的环境某个环节出问题了,打测试的包,切换host在本地进行测试,程序报错,链接不到某台服务器,即测试环境的服务器的我们库所在端口的服务没有启动。
3、测试新建活动失败 ---redis 缓存的问题
在解决这个问题的时候就比较坑了,因为刚刚刚找测试启动了断了连接的mongo表所在的服务器,
所以排除了是环境问题,但是经过跟踪调试确实是程序里面的某个该去mongo表里面取值的地方没有获取到值,导致后面出现的异常问题,
这时控制台报错有异常抛错,过了一会又出现mongo连接不上的异常,再次询问测试的环境搭建人员查找原因,得到的原因如下:
“刚刚启动命令少加了后台运行的参数。”
好了解决完了这个问题应该都OK了吧,但是还没结束。。。
控制台虽然没有再报连接不上mongo所在那台服务器的错误,但是异常信息仍然存在,依然一个值获取为空导致的异常:
哈哈下面来看看这个值获取的代码吧:
public PagePrototype findPagePrototypeCached(Long id) {
String key = CacheConstants.getPagePrototypeCacheKey(id);
PagePrototype prototype = redisUtil.getObject(key, PagePrototype.class);
if(prototype != null){
return prototype;
}
prototype = pagePrototypeDao.queryById(id);
if (prototype != null) {
String contentPath = prototype.getContentPath();
prototype.setContent(fileEntryManager.getFileContent(contentPath,MongoTable.TABLE_PAGE_PROTOTYPE));
String demoPath = prototype.getDemoPath();
prototype.setDemo(fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE));
redisUtil.setObjectByExpire(key, prototype,CacheConstants.CACHE_ONE_WEEK);
}
return prototype;
}
这里呢某个重要值就是Demo啦,跟据我们的代码可以看到Demo值是不可能为空的,因为在初始化进来的时候就会
prototype.setDemo(fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE));
通过这句去mongo里面取值set进去。
好了巧合来了:
刚刚我们的mongo挂了,所以第一次进来的时候当然没走缓存,因为还没有这个key值,然后就去我们的mongo表里面查找呗,刚好mongo也挂了,所以就没有从我们mongo表里面获取到数据,fileEntryManager.getFileContent(demoPath,MongoTable.TABLE_PAGE_PROTOTYPE)
程序继续向下执行就把没有获取到数据的这个对象放到了我们的缓存里面,方便下次用。。。。
所以就造成了我们后面修复了mongo,对象里面的值还是没有获取到,
原因是后面程序都是从缓存取值,缓存刚好存的是之前没有获取到值的时候的对象。
像这种原因只有看代码才找的到的!!
前面确实是环境挂了的问题,后面说说我们程序的问题吧,像这种问题我们可以在程序里面处理一下那个可能为空的值,当为空的时候应该把错误打出来,这样才方便查找定位问题的所在,不至于浪费一下午的时间排除问题!
---------------------