Caching 从Spring中的异步函数调用时缓存未刷新
我正在调用一个带有cacheexecute注释的函数。这是从本身异步执行的函数调用的 在函数执行后,缓存似乎没有被逐出 下面是示例代码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
@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();
}
}