@Cacheable и @ Asyn c не всегда работают в одном классе - PullRequest
1 голос
/ 04 марта 2020

Я наткнулся на эту проблему несколько неожиданно.

Но в действительности в этом нет ничего особенного. Используя 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 работают с контроллера ...

Решения:

  1. Не используйте @Cacheable, но используйте Caffeine или Guava Cache напрямую ...
  2. Используйте Runables: Spring @ Asyn c метод внутри Сервиса ... Но я не думайте, что это симпатичное решение
  3. Разделить службу ... Не всегда возможно и также может привести к уменьшению объема поддерживаемого кода.

Предложения?

...