2015-07-30 2 views
2

Я работаю над абстракцией spring-data-redis и кэша в моем коде. Я использовал redis как кеширующий сервер в абстракции кеша. кеш-абстракция помогает всякий раз, когда я нажимаю JPARepository для данных. Он выполняет метод получения данных из db в первый раз и получает его из кэша со второго раза.Механизм отката кэша в Spring-boot с использованием абстракции кэша

Мой главный запрос:
Есть ли способ для кэша абстракции, чтобы определить, что сервер кэширования не вверх, поэтому он должен выполнить метод снова, чтобы получить данные из БД и не застрял при попытке получить из кэша.

Вот код:

Для настройки кэша:

@Configuration 
@EnableCaching 
public class CacheConfig { 

@Autowired 
private ApplicationContext applicationContext; 

/* below code is specific to redis implementation */ 



     @Bean 
     public RedisConnectionFactory redisConnectionFactory(@Value("${redis.host}") String redisHost, 
     @Value("${redis.port}") Integer redisPort) { 
      JedisConnectionFactory cf = new JedisConnectionFactory(); 
      cf.setHostName(redisHost); 
      cf.setPort(redisPort); 
      return cf; 
     } 

     @Bean(name="redisTemplate") 
     RedisTemplate redisTemplate() 
     { 
      final RedisTemplate template = new RedisTemplate(); 
      template.setConnectionFactory(applicationContext.getBean(RedisConnectionFactory.class)); 
      return template; 
     } 

     @Bean 
     public CacheManager cacheManager() { 
      RedisCacheManager redisCacheManager = new RedisCacheManager((RedisTemplate) applicationContext.getBean("redisTemplate")); 
      redisCacheManager.setTransactionAware(true); 
      redisCacheManager.setUsePrefix(true); 
      return redisCacheManager; 
     } 

}

код, где я использую кэш:

@Override 
@Cacheable(value = IC_CACHE, key = "#id") 
public IssueCategory getIssueCategoriesById(Integer id) { 
    return issueCategoriesRepo.findById(id); 
} 

Пусть теперь Redis перестает работать или выключение сзади. Это дает следующее исключение:

java.net.ConnectException: Connection refused 
 
\t at java.net.PlainSocketImpl.socketConnect(Native Method) 
 
\t at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:345) 
 
\t at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 
 
\t at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 
 
\t at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 
 
\t at java.net.Socket.connect(Socket.java:589) 
 
\t at redis.clients.jedis.Connection.connect(Connection.java:144) 
 
\t at redis.clients.jedis.BinaryClient.connect(BinaryClient.java:71) 
 
\t at redis.clients.jedis.BinaryJedis.connect(BinaryJedis.java:1783) 
 
\t at redis.clients.jedis.JedisFactory.makeObject(JedisFactory.java:65) 
 
\t at org.apache.commons.pool2.impl.GenericObjectPool.create(GenericObjectPool.java:836) 
 
\t at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:434) 
 
\t at org.apache.commons.pool2.impl.GenericObjectPool.borrowObject(GenericObjectPool.java:361) 
 
\t at redis.clients.util.Pool.getResource(Pool.java:40) 
 
\t at redis.clients.jedis.JedisPool.getResource(JedisPool.java:84) 
 
\t at redis.clients.jedis.JedisPool.getResource(JedisPool.java:10) 
 
\t at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.fetchJedisConnector(JedisConnectionFactory.java:133) 
 
\t at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:229) 
 
\t at org.springframework.data.redis.connection.jedis.JedisConnectionFactory.getConnection(JedisConnectionFactory.java:57) 
 
\t at org.springframework.data.redis.core.RedisConnectionUtils.doGetConnection(RedisConnectionUtils.java:128) 
 
\t at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:91) 
 
\t at org.springframework.data.redis.core.RedisConnectionUtils.getConnection(RedisConnectionUtils.java:78) 
 
\t at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:177) 
 
\t at org.springframework.data.redis.core.RedisTemplate.execute(RedisTemplate.java:152) 
 
\t at org.springframework.data.redis.cache.RedisCache.get(RedisCache.java:88) 
 
\t at org.springframework.cache.transaction.TransactionAwareCacheDecorator.get(TransactionAwareCacheDecorator.java:66) 
 
\t at org.springframework.cache.interceptor.AbstractCacheInvoker.doGet(AbstractCacheInvoker.java:68) 
 
\t at org.springframework.cache.interceptor.CacheAspectSupport.findInCaches(CacheAspectSupport.java:461) 
 
\t at org.springframework.cache.interceptor.CacheAspectSupport.findCachedItem(CacheAspectSupport.java:432) 
 
\t at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:333) 
 
\t at org.springframework.cache.interceptor.CacheAspectSupport.execute(CacheAspectSupport.java:299) 
 
\t at org.springframework.cache.interceptor.CacheInterceptor.invoke(CacheInterceptor.java:61) 
 
\t at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
 
\t at org.springframework.aop.framework.JdkDynamicAopProxy.invoke(JdkDynamicAopProxy.java:207) 
 
\t at com.sun.proxy.$Proxy113.getIssueCategoriesById(Unknown Source) 
 
\t at com.somexyz.somemodule.service.impl.RulesEngineServiceImpl.getApplicableNodes(RulesEngineServiceImpl.java:94) 
 
\t at com.somexyz.somemodule.web.api.somemoduleAPIController.getApplicableNodes(somemoduleAPIController.java:35) 
 
\t at com.somexyz.somemodule.web.api.somemoduleAPIController$$FastClassBySpringCGLIB$$1dabf625.invoke(<generated>) 
 
\t at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204) 
 
\t at org.springframework.aop.framework.CglibAopProxy$CglibMethodInvocation.invokeJoinpoint(CglibAopProxy.java:717) 
 
\t at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:157) 
 
\t at com.somexyz.somemodule.web.config.ResponseTimeInterceptor.invokeUnderTrace(ResponseTimeInterceptor.java:23) 
 
\t at org.springframework.aop.interceptor.AbstractTraceInterceptor.invoke(AbstractTraceInterceptor.java:112) 
 
\t at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
 
\t at org.springframework.aop.interceptor.ExposeInvocationInterceptor.invoke(ExposeInvocationInterceptor.java:92) 
 
\t at org.springframework.aop.framework.ReflectiveMethodInvocation.proceed(ReflectiveMethodInvocation.java:179) 
 
\t at org.springframework.aop.framework.CglibAopProxy$DynamicAdvisedInterceptor.intercept(CglibAopProxy.java:653) 
 
\t at com.somexyz.somemodule.web.api.somemoduleAPIController$$EnhancerBySpringCGLIB$$c8dbe185.getApplicableNodes(<generated>) 
 
\t at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
 
\t at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
 
\t at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
 
\t at java.lang.reflect.Method.invoke(Method.java:497) 
 
\t at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:221) 
 
\t at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:137) 
 
\t at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:110) 
 
\t at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:776) 
 
\t at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:705) 
 
\t at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
 
\t at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:959) 
 
\t at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:893) 
 
\t at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
 
\t at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:868) 
 
\t at javax.servlet.http.HttpServlet.service(HttpServlet.java:644) 
 
\t at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
 
\t at javax.servlet.http.HttpServlet.service(HttpServlet.java:725) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.boot.actuate.autoconfigure.EndpointWebMvcAutoConfiguration$ApplicationContextHeaderFilter.doFilterInternal(EndpointWebMvcAutoConfiguration.java:291) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.web.filter.HiddenHttpMethodFilter.doFilterInternal(HiddenHttpMethodFilter.java:77) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:330) 
 
\t at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.invoke(FilterSecurityInterceptor.java:118) 
 
\t at org.springframework.security.web.access.intercept.FilterSecurityInterceptor.doFilter(FilterSecurityInterceptor.java:84) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.access.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:113) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.session.SessionManagementFilter.doFilter(SessionManagementFilter.java:103) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.authentication.AnonymousAuthenticationFilter.doFilter(AnonymousAuthenticationFilter.java:113) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.servletapi.SecurityContextHolderAwareRequestFilter.doFilter(SecurityContextHolderAwareRequestFilter.java:154) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.savedrequest.RequestCacheAwareFilter.doFilter(RequestCacheAwareFilter.java:45) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.authentication.AbstractAuthenticationProcessingFilter.doFilter(AbstractAuthenticationProcessingFilter.java:199) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.authentication.logout.LogoutFilter.doFilter(LogoutFilter.java:110) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.header.HeaderWriterFilter.doFilterInternal(HeaderWriterFilter.java:57) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.context.SecurityContextPersistenceFilter.doFilter(SecurityContextPersistenceFilter.java:87) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.context.request.async.WebAsyncManagerIntegrationFilter.doFilterInternal(WebAsyncManagerIntegrationFilter.java:50) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.springframework.security.web.FilterChainProxy$VirtualFilterChain.doFilter(FilterChainProxy.java:342) 
 
\t at org.springframework.security.web.FilterChainProxy.doFilterInternal(FilterChainProxy.java:192) 
 
\t at org.springframework.security.web.FilterChainProxy.doFilter(FilterChainProxy.java:160) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at com.somexyz.somemodule.web.config.somemoduleRequestMetricsFilter.doFilter(somemoduleRequestMetricsFilter.java:33) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.boot.actuate.trace.WebRequestTraceFilter.doFilterInternal(WebRequestTraceFilter.java:102) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:85) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.springframework.boot.actuate.autoconfigure.MetricFilterAutoConfiguration$MetricsFilter.doFilterInternal(MetricFilterAutoConfiguration.java:90) 
 
\t at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:107) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239) 
 
\t at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) 
 
\t at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219) 
 
\t at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106) 
 
\t at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501) 
 
\t at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142) 
 
\t at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79) 
 
\t at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88) 
 
\t at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:516) 
 
\t at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1086) 
 
\t at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:659) 
 
\t at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:223) 
 
\t at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1558) 
 
\t at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1515) 
 
\t at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
 
\t at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
 
\t at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61) 
 
\t at java.lang.Thread.run(Thread.java:745)

Есть ли способ, чтобы справиться с этим, так что система не терпит неудачу. Пожалуйста, совет.

ответ

2

По Spring загрузки 1.2 (Spring Framework 4.1 и более поздней версии), абстракция кэш обеспечивает интерфейс стратегии, которые можно реализовать, чтобы справиться с этими ошибками: CacheErrorHandler

Ваш CacheConfig должен простираться от CachingConfigurerSupport и переопределить метод errorHandler() (проверка Джавадок).

Смежные вопросы