Как обновить кеш Spring при использовании репозитория весенних данных

Я пытаюсь реализовать реплицированный кеш в распределенном приложении, управляемом Spring, с помощью activemq (jms). Несколько экземпляров сервера приложений должны обновить свою копию кеша, когда один из них инициирует изменение. Я пытаюсь реализовать отдельное приложение, чтобы имитировать это.

У меня есть приложение для весенней загрузки, которое использует CrudRepository весенних данных. Я включил кеширование, добавив аннотации @Cacheable.

@RepositoryRestResource
public interface PersonRepository extends CrudRepository<Person,Long>{

    @Cacheable(value = "myCache")
    List<Person> findAll();

    @Override
    @CacheEvict(value = "myCache", allEntries=true)
    Person save(Person p);

}

Как я могу обновить этот кеш, которым управляет весна, с помощью некоторого настраиваемого кода? Есть два события, когда требуется обновление

  1. Когда вызывается метод сохранения, я хотел бы выполнить код производителя jms, чтобы подтолкнуть объект java (Person) к теме jms. Как я могу добавить настраиваемое поведение для вызова кода производителя jms после сохранения объекта java в методе сохранения?

  2. Обновите кеш (myCache) в коде потребителя jms. Как я могу получить дескриптор этого кеша в репозитории данных Spring, внешнем по отношению к этому интерфейсу, для этого?

Спасибо.

Не используйте для этого @Cacheable. Вместо этого используйте правильную интеграцию кеширования для вашего поставщика сохраняемости (возможно, в спящем режиме). Также зачем реализовывать собственное кеширование, есть несколько проверенных решений.

M. Deinum 13.03.2018 20:58

Мы создаем собственную структуру кеширования, чтобы иметь точный контроль над ней. Мы пробовали некоторые из популярных, таких как JBoss TreeCache, но они оказались для нас неудачными. Даже если использовать другую интеграцию кеширования, как мне перехватить вызовы репозитория данных Spring?

Andy Dufresne 14.03.2018 06:44

Вы не должны. Вам следует интегрироваться со своим поставщиком постоянства. Вызов сохранения не является обязательным, что если кто-то использует аннотацию @Modifying на @Query для определения обновления. Вы можете попробовать и сказать всем, чтобы они также поместили на него @CacheEvict и т. д., Но это не удастся. Вам нужна лучшая интеграция. Поэтому, если вам что-то нужно, вам нужно реализовать кэширование на уровне поставщика сохраняемости, а не использовать абстракцию кэширования Springs. Для этого реализуйте соответствующие интерфейсы и соответствующим образом настройте провайдера.

M. Deinum 14.03.2018 07:20
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
938
0

Другие вопросы по теме