CacheFilter is a core component of dubbo.Enabling cache key of service,method,consumer or provider dubbo will cache method return value. Along with cache key we need to configure cache type. Dubbo default implemented cache types are: lru threadlocal jcache expiring
Caused by: java.lang.NoClassDefFoundError: javax/cache/Caching at org.apache.dubbo.cache.support.jcache.JCache.<init>(JCache.java:54) at org.apache.dubbo.cache.support.jcache.JCacheFactory.createCache(JCacheFactory.java:45) at org.apache.dubbo.cache.support.AbstractCacheFactory.getCache(AbstractCacheFactory.java:74) at org.apache.dubbo.cache.CacheFactory$Adaptive.getCache(CacheFactory$Adaptive.java) at org.apache.dubbo.cache.filter.CacheFilter.invoke(CacheFilter.java:95) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:321) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:193) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invokeWithContext(AbstractClusterInvoker.java:378) at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:80) ... 25 more
Caused by: javax.cache.CacheException: No CachingProviders have been configured at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:391) at javax.cache.Caching$CachingProviderRegistry.getCachingProvider(Caching.java:361) at javax.cache.Caching.getCachingProvider(Caching.java:151) at org.apache.dubbo.cache.support.jcache.JCache.<init>(JCache.java:54) at org.apache.dubbo.cache.support.jcache.JCacheFactory.createCache(JCacheFactory.java:45) at org.apache.dubbo.cache.support.AbstractCacheFactory.getCache(AbstractCacheFactory.java:74) at org.apache.dubbo.cache.CacheFactory$Adaptive.getCache(CacheFactory$Adaptive.java) at org.apache.dubbo.cache.filter.CacheFilter.invoke(CacheFilter.java:95) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:321) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:193) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invokeWithContext(AbstractClusterInvoker.java:378) at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:80) ... 25 more
报错信息出现了一个从来没见过的 CacheException 缓存异常的类,而且还提示 No CachingProviders have been configured 没有配置缓存提供者,这是什么缘故呢,有点不知所措了。
/** * Obtains the only {@link CachingProvider} defined by the specified * {@link ClassLoader}. * <p> * Should zero or more than one {@link CachingProvider}s be available, a * CacheException is thrown. * </p> * @param classLoader the {@link ClassLoader} to use for loading the * {@link CachingProvider} * @return the {@link CachingProvider} * @throws CacheException should zero or more than one * {@link CachingProvider} be available * or a {@link CachingProvider} could not be loaded * @see #getCachingProviders(ClassLoader) */ // javax.cache.Caching.CachingProviderRegistry#getCachingProvider(java.lang.ClassLoader) public CachingProvider getCachingProvider(ClassLoader classLoader) { // 获取所有 CachingProvider 接口的所有实现类 // 如果配置了 javax.cache.spi.cachingprovider 系统属性,那就用 loadClass 方法加载实现类 // 否则通过 ServiceLoader.load JDK 的 SPI 机制进行加载所有的 CachingProvider 实现类 Iterator<CachingProvider> iterator = getCachingProviders(classLoader).iterator(); // 迭代开始循环所有的实现类 if (iterator.hasNext()) { // 取出第一个实现类 CachingProviderprovider= iterator.next(); // 然后再尝试看看是否还有第二个实现类 if (iterator.hasNext()) { // 如果有第二个实现类,则直接抛出多个缓存提供者的异常 thrownewCacheException("Multiple CachingProviders have been configured when only a single CachingProvider is expected"); } else { // 如果没有第二个实现类,那么就直接使用第一个实现类 // 也就意味着,当前系统在运行时只允许有一个实现类去实现 CachingProvider 接口 return provider; } } else { // 抛出了 CacheException 异常类 // 抛出的提示信息,不正是报错中的看到的那段没有配置提供者的原文么 thrownewCacheException("No CachingProviders have been configured"); } }
Caused by: java.lang.IllegalStateException: Default configuration hasn't been specified! at org.redisson.jcache.JCacheManager.createCache(JCacheManager.java:118) at org.apache.dubbo.cache.support.jcache.JCache.<init>(JCache.java:67) at org.apache.dubbo.cache.support.jcache.JCacheFactory.createCache(JCacheFactory.java:45) at org.apache.dubbo.cache.support.AbstractCacheFactory.getCache(AbstractCacheFactory.java:74) at org.apache.dubbo.cache.CacheFactory$Adaptive.getCache(CacheFactory$Adaptive.java) at org.apache.dubbo.cache.filter.CacheFilter.invoke(CacheFilter.java:95) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CopyOfFilterChainNode.invoke(FilterChainBuilder.java:321) at org.apache.dubbo.rpc.cluster.filter.FilterChainBuilder$CallbackRegistrationInvoker.invoke(FilterChainBuilder.java:193) at org.apache.dubbo.rpc.cluster.support.AbstractClusterInvoker.invokeWithContext(AbstractClusterInvoker.java:378) at org.apache.dubbo.rpc.cluster.support.FailoverClusterInvoker.doInvoke(FailoverClusterInvoker.java:80) ... 25 more
看这个非法状态的异常 Default configuration hasn't been specified!,表示没有指定的默认配置文件,不过想想也是的,Redis 是第三方缓存服务,当然需要对应的配置文件,不然应用程序怎么知道要连接哪个 Redis 服务呢?