spring4集成redis问题总结

分类:软件编程
阅读:403
作者:majingjing
发布:2017-07-13 10:54

image.png

之前系统已经集成了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正常工作。