Caching 从Spring中的异步函数调用时缓存未刷新

Caching 从Spring中的异步函数调用时缓存未刷新,caching,asynchronous,spring-boot,ehcache,spring-cache,Caching,Asynchronous,Spring Boot,Ehcache,Spring Cache,我正在调用一个带有cacheexecute注释的函数。这是从本身异步执行的函数调用的 在函数执行后,缓存似乎没有被逐出 下面是示例代码 @Async("executor1") public void function1() { // do something anotherFunction("name", 123, 12); // do something more } @CacheEvict(cacheNames = {"cache1", "cache2", "c

我正在调用一个带有cacheexecute注释的函数。这是从本身异步执行的函数调用的

在函数执行后,缓存似乎没有被逐出

下面是示例代码

@Async("executor1")
public void function1()
{
    // do something

    anotherFunction("name", 123, 12);

   // do something more

}

@CacheEvict(cacheNames = {"cache1", "cache2", "cache3"}, key = "#testId")
public List<Integer> anotherFunction(String name, int testId, int packageId)
{
  // some code here
}
我想要的是,对应于testId的条目应该从所有缓存中清除。 然而,在另一个调用中,我可以看到cache1的旧条目。正在从控制器调用函数1。这两个功能都存在于服务中。现在,这个配置正确吗?如果是,缓存未被清除的可能原因是什么


谢谢你的帮助。提前感谢。

我认为您的问题在于Spring代理不可重入。为了实现异步和缓存退出,Spring创建了一个代理。因此,在您的示例中,调用堆栈将是:

A->B$$proxy.function1->B.function1->B.anotherFunction

B$$proxy包含异步和逐出的逻辑。当直接调用另一个函数时,这将不适用。事实上,即使删除@Async,它仍然无法工作

可以使用的技巧是将代理bean注入类中。改为委托给类的代理

它起作用了。但有一个陷阱。如果您现在直接调用另一个函数,它将无法工作。我认为这是一个弹簧错误,并将它作为文件。

我已经尝试过这个,但它不起作用。我不知道这和我犯的错误不同。现在,我已经删除了注释,并正在使用CacheManager删除所需的缓存。虽然我不确定它有多正确。我的意思是注入代理。就像在我的代码示例中一样。这很有效。我试过了。
public class MyClass {    
  private MyClass meWithAProxy;

  @Autowired
  ApplicationContext applicationContext;

  @PostConstruct
  public void init() {
    meWithAProxy = applicationContext.getBean(MyClass.class);
  }

  @Async("executor1")
  public void function1() {
    meWithAProxy.anotherFunction("name", 123, 12);
  }

  @CacheEvict(cacheNames = "cache1", key = "#testId")
  public List<Integer> anotherFunction(String name, int testId, int packageId) {
    return Collections.emptyList();
  }

}