为什么@Cacheable内部的条件没有影响?

时间:2019-09-12 12:44:28

标签: java spring spring-boot spring-cache jcache

我有以下方法:

@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为假

我怎么了?

1 个答案:

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