当前位置: 首页 > 知识库问答 >
问题:

基于Spring boot的REST服务,使用hazelcast的Spring缓存无法处理缓存错误

楚煜
2023-03-14

我使用Spring boot和hazelcast作为我的REST缓存服务。

我在服务层(API)使用带有自定义密钥生成器的spring@cacable注释进行缓存。除了从自定义键生成器函数中抛出RuntimeException之外,其他一切都可以正常工作,它不是由我添加到处理错误场景中的自定义错误类处理的。

扩展组织的自定义错误类(CacheErrorHandler)。springframework。隐藏物注释。CachingConfigurerSupport覆盖所有处理获取、放置和逐出错误的方法

在我的例子中,如果自定义customKeyGenerator抛出RuntimeException,我希望它能进入handleCacheGetError函数。

有谁能告诉我我这里缺少什么,或者帮助我解释一下,使用spring注释(即使用@Cachable)处理缓存错误(如HAZELCAST或REDIS等)的正确方法是什么。

下面是我的API缓存的示例

@Cacheable(cacheNames = "TestCache",keyGenerator = "customKeyGenerator")
public Response getAPIResponse(Integer param1){
...
}

类似地,我的缓存配置类扩展了CachingConfigurerSupport,如下所示

@Configuration
public class CacheConfiguration extends CachingConfigurerSupport {
...

@Override
    public CacheErrorHandler errorHandler() {
        return new CustomHZCacheErrorHandler();
    }
...
}

这里CustomHZCacheErrorHandler看起来像

public class CustomHZCacheErrorHandler implements CacheErrorHandler {
    private static final Logger logger = LoggerFactory.getLogger(CustomHZCacheErrorHandler.class);

    public CustomHZCacheErrorHandler() {
    }

    public void handleCacheGetError(RuntimeException exception, Cache cache, Object key) {
        logger.warn("Error while getting cache " + cache.getName() + " for Key " + key);
    }

    public void handleCachePutError(RuntimeException exception, Cache cache, Object key, Object value) {
        logger.warn("Error while putting cache " + cache.getName() + " for Key " + key);
    }

    public void handleCacheEvictError(RuntimeException exception, Cache cache, Object key) {
        logger.warn("Error while evicting cache " + cache.getName() + " for Key " + key);
    }

    public void handleCacheClearError(RuntimeException exception, Cache cache) {
        logger.warn("Error while clearing cache " + cache.getName());
    }
}

共有1个答案

鲁斯伯
2023-03-14

@NRA,据Spring Doc报道,https://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/cache/interceptor/CacheErrorHandler.html,CacheErrorHandler仅使用缓存提供程序引发的异常,而不使用其他异常。不适用于密钥生成器,甚至不适用于带注释的方法引发的异常。

请看:https://github.com/spring-projects/spring-framework/blob/master/spring-context/src/main/java/org/springframework/cache/interceptor/AbstractCacheInvoker.java#L71

对于MVC控制器,Spring有一个注释来帮助您处理错误:@ErrorHandler。您可以在此处找到更多详细信息:https://spring.io/blog/2013/11/01/exception-handling-in-spring-mvc

如果不使用MVC,您可以定义一个AspectBean

请看这个工作示例:https://gist.github.com/gokhanoner/026c2b90fe3a61b93626383a61932395

注意:我没有测试从Cache提供程序端抛出异常,您可能还需要为该部分定义CacheErrorHandler

 类似资料:
  • 我正在寻找集成Hazelcast到我的应用程序... 我的要求是将所有数据加载到缓存并从缓存中提取。。 我有两个选择。 1) Hazelcast IMap 2)因为我使用的是Spring启动,所以我可以使用(@Cacheable/@CacheEvict)。 我能得到一些建议吗... 提前谢谢你。。

  • 本文向大家介绍springboot使用GuavaCache做简单缓存处理的方法,包括了springboot使用GuavaCache做简单缓存处理的方法的使用技巧和注意事项,需要的朋友参考一下 问题背景 实际项目碰到一个上游服务商接口有10秒的查询限制(同个账号)。 项目中有一个需求是要实时统计一些数据,一个应用下可能有多个相同的账号。由于服务商接口的限制,当批量查询时,可能出现同一个账号第一次查询

  • 我的Spring应用程序由两个上下文xml配置文件组成,第一个是根上下文。xml仅扫描非控制器带注释的bean: 而第二个servlet上下文。xml包含所有spring mvc设置和扫描控制器带注释的bean web.xml上的DispatcherServlet配置如下所示 我想尝试基于注释的缓存,所以我将以下bean定义添加到root-context.xml 并使用一个带有注释的类来测试这一点

  • 本文向大家介绍基于Centos7 部署Varnish缓存代理服务器,包括了基于Centos7 部署Varnish缓存代理服务器的使用技巧和注意事项,需要的朋友参考一下 一.Varnish概述 1.Varnish 简介 Varnish是一款高性能且开源的反向代理服务器和HTTP加速器,其采用全新的软件体系机构,和现在的硬件体系紧密配合。与传统的squid相比,Varnish具有高性能、速度快、管理更

  • 我在我的应用程序中使用了spring缓存层,我在编写使用Mockito测试spring缓存层的单元测试时遇到了一个问题。 服务层的JUnit测试代码: 例外情况: 我得到了一个“”,因为缓存层没有工作,并且调用被传递到repository对象(两次),该对象返回了上面的'Customer2'模拟对象,即通过传递服务层,对同一个键调用了两次repository方法。