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
答案 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