之前系统已经集成了redis但是只是单纯用java客户端来完成的操作,并没有和spring进行集成。 现在断断续续会出现redis断连的问题,导致一些缓存失效。
系统动态切换缓存方式的入口是如下代码
public static ITmCache newTmCache() {
if (Tools.isNull(cache)) {
try {
String tmcacheClassImpl = SysPropertiesUtils.getProp("TMCACHE_CLASS_IMPL");
if(Tools.isEmpty(tmcacheClassImpl)){
log.warn("缓存的加载类没有配置,采用默认的MapCache缓存");
cache = new MapCache();
return cache;
}
// Class<?> loadClass = TmCacheFactory.class.getClassLoader().loadClass(tmcacheClassImpl);
Class<Object> loadClass = TmClassUtils.loadClass(tmcacheClassImpl);
Object newInstance = loadClass.newInstance();
cache = (ITmCache) newInstance;
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException e) {
cache = new MapCache();
}
}
return cache;
}
现在将记录下集成的时候出现的问题
java.lang.NoClassDefFoundError: Could not initialize class JedisConnection
刚开始一直当成ClassNotFound异常来查找,以为是jar包没有找到。看下pom的依赖也是有的。 出现以上问题我就觉得奇怪了,单元测试的时候明明是可以的。 仔细看了下异常信息, NoClassDef 这个错误,和 ClassNotFound 不是一个东西,这个是说明编译的时候是正确的,但是在运行的时候类加载可能出现问题。 再次看了下代码,怀疑是 类加载器不同导致的,
public static <T> Class<T> loadClass(String name) throws ClassNotFoundException {
return (Class<T>) Thread.currentThread().getContextClassLoader().loadClass(name);
}
代码应该没有问题啊。 百度搜索了下,说是版本问题。 https://stackoverflow.com/questions/30447919/cannot-get-connection-for-redistemplate-for-spring-data-redis/31023359#31023359
后来调整版本为 redis:2.4.2 spring-data-redis:1.2.1.RELEASE
启动服务器后,redis正常工作。