Hystrix Javanica @CacheResult

时间:2018-04-06 18:26:59

标签: spring-boot spring-cloud-netflix hystrix netflix

com.netflix.hystrix.contrib.javanica.cache.annotation.CacheResult - 我对Hystrix-Javanica给出的@CacheResult注释感到有点困惑。根据文档 - 它可以缓存HystrixCommand的结果。在以下示例中,服务始终执行@HystrixCommand带注释的方法,并且无法理解为什么@CacheResult没有发挥作用。

    Map<String, String> map = new HashMap<>();

    @CacheResult(cacheKeyMethod="getCacheKey")
    @HystrixCommand(fallbackMethod = "callStudentServiceAndGetData_Fallback", commandProperties=  {
            @HystrixProperty(name="requestCache.enabled" , value="true")
    } )
    public String callStudentServiceAndGetData(@CacheKey String schoolname) {
        System.out.println("Getting School details for " + schoolname);
        String response = restTemplate.exchange("http://localhost:8098/getStudentDetailsForSchool/{schoolname}",HttpMethod.GET, null, new ParameterizedTypeReference<String>() {}, schoolname).getBody();

        map.put(schoolname, response);
        return response;
    }

    public String getCacheKey (String key) {
            return map.get(key);
    }

private String callStudentServiceAndGetData_Fallback(String schoolname) {
        return "Service down. "+ new Date();
    }

我没有找到任何有关Havtrix和Javanica注释的有用示例。你能看看我在这里缺少什么吗? TIA

1 个答案:

答案 0 :(得分:0)

对我而言,您似乎缺少以下内容:

1)Hystrix使用内部缓存实现,这意味着您不需要使用某种存储(在您的示例中为map)并手动放入/获取。您应该做的唯一一件事是指定缓存密钥。

2)要指定Hystrix密钥的内容,您可以使用@CacheKey注释或cacheKeyMethod="getCacheKey"注释参数。没有理由同时使用它们。有关更多选项,请查看javanica docs

3)Hystrix缓存仅在相同的HTTP请求执行期间存在。这意味着如果您将通过HTTP连续两次调用您的服务,则具有相同的缓存密钥值将不存在。所以Hystrix缓存可能不是你想要的东西。

4)要激活缓存功能,您必须调用

HystrixRequestContext c = HystrixRequestContext.initializeContext();

在命令执行之前和

 c.shutdown();

后。

Web过滤器是添加此类初始化的正确位置。有关详细信息,请点击Hystrix caching