我有以下方法:
@Cacheable(value = "pow_cache", unless = "#pow==3",condition = "#val<5&&#result<100")
public Double pow(int val, int pow) throws InterruptedException {
System.out.println(String.format("REAL invocation myService.pow(%s, %s)", val, pow));
Thread.sleep(3000);
return Math.pow(val, pow);
}
及以下主要内容:
@SpringBootApplication
@EnableCaching
public class Main {
public static void main(String[] args) throws InterruptedException {
ConfigurableApplicationContext context = SpringApplication.run(Main.class);
MyService myService = context.getBean(MyService.class);
invokePow(myService, 4, 4);
}
private static void invokePow(MyService myService, int val, int pow) throws InterruptedException {
for (int i = 0; i < 2; i++) {
System.out.println(String.format("invoke myService.pow(%s, %s)", val, pow));
System.out.println(myService.pow(val, pow));
}
}
}
我看到以下输出:
invoke myService.pow(4, 4)
REAL invocation myService.pow(4, 4)
256.0
invoke myService.pow(4, 4)
256.0
所以这意味着结果被缓存了,但是由于
condition = "#val<5&&#result<100"
结果为256,256<100
为假
我怎么了?
答案 0 :(得分:1)
unless
和#result
之间存在差异。基于此
公共抽象字符串,除非
Spring Expression Language(SpEL)属性用于否决方法缓存。
与condition()不同,此表达式是在调用方法后求值的,因此可以引用结果。默认值为“”,表示永远不会否决缓存。
来自spring doc 3.2.x
您只能在unless
中使用@Cacheable(value = "pow_cache", unless = "#pow==3||#result>100",condition = "#val<5")
。
您可以尝试
ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls
| SecurityProtocolType.Tls11
| SecurityProtocolType.Tls12
| SecurityProtocolType.Ssl3;