Я наткнулся на эту проблему несколько неожиданно.
Но в действительности в этом нет ничего особенного. Используя Cache и Asyn c из одной и той же службы.
Я создал хранилище для демонстрации проблемы: https://github.com/MBurchard/cachedemo
Существует две версии:
- v1: без «самоинжекции» только вызов сервисных методов из контроллера
- v2: с самоинъекцией для проверки всех .. вызовы изнутри и снаружи.
Пока вам не нужен другой прокси, потому что вы не хотите использовать @ Asyn c в том же классе, это также работает с версией v2, то есть с «самоинъекцией» через InitializingBean.
Но даже это требование иметь @ Asyn c и @Cacheable в одном и том же сервисе теперь не слишком сложно. Конечно, я не хочу использовать обе аннотации для одного и того же метода, это точно.
Но, как вы можете видеть в версии v2, только вызовы @ Asyn c, но не вызовы @Cacheable , работают внешне, например от контроллера. Но внутренне, используя собственную ссылку, работают только вызовы @Cacheable, но не вызовы @ Asyn c.
Похоже, Spring вводит в контроллер один прокси и в сервис (сам) другой proxy.
Как вы можете видеть в версии v1, без самоинъекции, @Cacheable и @ Asyn c работают с контроллера ...
Решения:
- Не используйте @Cacheable, но используйте Caffeine или Guava Cache напрямую ...
- Используйте Runables: Spring @ Asyn c метод внутри Сервиса ... Но я не думайте, что это симпатичное решение
- Разделить службу ... Не всегда возможно и также может привести к уменьшению объема поддерживаемого кода.
Предложения?