Статьи

Использование CDI для доступа к Infinispan

Начиная с версии 5.0, Infinispan добавил поддержку доступа CDI к своей платформе сетки данных, а также предоставляет интерфейс кеша, совместимый с JSR107. Я поговорил с Питером Мьюиром и Кевином Полле, чтобы узнать больше о доступе к CDI и о том, почему это важно, JSR107 и будущих планах Infinispan.

 

DZone: Не могли бы вы представить Infinispan?

Питер Мьюир / Кевин Поллет: Infinispan от JBoss — чрезвычайно масштабируемая, высокодоступная платформа для работы с сеткой данных — на 100% с открытым исходным кодом и написана на Java. Цель Infinispan — показать структуру данных с высокой степенью параллелизма, спроектированную с нуля, чтобы максимально использовать современные многопроцессорные / многоядерные архитектуры и в то же время предоставлять возможности распределенного кэша. В своей основе Infinispan предоставляет интерфейс кэширования, совместимый с JSR-107 (JCACHE) (который, в свою очередь, расширяет java.util.Map). Он также опционально поддерживается архитектурой одноранговой сети для эффективного распределения состояния по сетке данных.

Предлагая высокую доступность посредством создания точных копий состояния по сети, а также, при необходимости, сохранения состояния в настраиваемых хранилищах кэша, Infinispan предлагает корпоративные функции, такие как эффективные алгоритмы вытеснения для управления использованием памяти, а также совместимость с JTA.

В дополнение к одноранговой архитектуре Infinispan в план входит возможность запускать фермы экземпляров Infinispan в качестве серверов и подключаться к ним, используя множество клиентов — как написанных на Java, так и на других популярных платформах.

DZone: Не могли бы вы объяснить, что такое CDI и почему это важно?

Питер Мьюир / Кевин Поллет:  CDI обеспечивает мощное и согласованное программирование, встроенное в ядро ​​Java EE (начиная с версии 6). Он предлагает безопасное внедрение типа, слабую связь через AOP (перехватчики и декораторы) и события, а также экстремальную расширяемость. CDI предлагает тесную интеграцию с технологиями Java EE (такими как JAX-RS и JPA) и, через расширения, с другими проектами, такими как Wicket и GWT (через JBoss ‘Errai).

Java EE 7 стремится обеспечить превосходную интеграцию CDI для других спецификаций (таких как JCache, новый стандарт кэширования и JMS 2). Сообщество также продвигается вперед, и вскоре вы можете ожидать отличную поддержку OSGi для Weld (RI CDI), CDI, встроенного прямо в ядро ​​ESB следующего поколения JBoss. Другие проекты, такие как Apache MyFaces CODI упорно работали, чтобы обеспечить дополнительную JSF и Bean Validation интеграции.

CDI призван предложить отличную производительность для разработчиков. Eclipse (через JBoss Tools), IDEA и NetBeans предлагают отличную поддержку CDI, а новый проект JBoss, Forge, предлагает строительные леса. И конечно, мы не можем забыть о тестировании! Вы можете легко объединить компоненты CDI с помощью макетов, но мы твердо верим в интеграционное тестирование и усердно работаем над проектом Arquillian, чтобы сделать его так же простым для тестирования на сервере приложений, как и для модульного тестирования.

В то время как CDI требуется для Java EE, JBoss и Apache предлагают поддержку CDI для контейнеров сервлетов (таких как Jetty и Tomcat), а также простой старый Java SE.

DZone: Почему Infinispan ввел интеграцию с CDI? Каковы преимущества?

Питер Мьюир / Кевин Поллет:  Кэширование является неотъемлемой частью архитектуры приложений — Infinispan — отличный выбор для этого; Между тем CDI предлагает отличную производительность для разработчиков. Преимуществ много, например, вы можете внедрить кеш в любой bean-компонент, управляемый CDI (например, EJB, сервлеты и управляемые bean-компоненты), используя аннотацию @Inject (и все это в безопасном подходе!). Другое преимущество заключается в том, что все конфигурации кэша всего приложения можно объединить в один класс Configuration.

DZone: Как это сочетается с работой, которую вы выполняете на JSR 107?

Питер Мьюир / Кевин Поллет:  JCache (он же JSR-107) определяет стандартный API-интерфейс кеширования для работы с автономным кешем, а также с распределенным кешем. Интересной частью спецификации являются аннотации, предназначенные для решения распространенных случаев использования кэширования. Расширение Infinispan CDI добавляет поддержку этих аннотаций.

DZone: Как мне заставить CDI работать с Infinispan? Какую версию я должен использовать? Какая конфигурация задействована?

Питер Мьюир / Кевин Поллет:  Модуль CDI доступен с Infinispan 5.0 (Pagoa). Чтобы это расширение работало, добавьте следующую зависимость и создайте файл beans.xml в своем приложении (как и любые приложения CDI).

<dependency>
    <groupId>org.infinispan</groupId>
    <artifactId>infinispan-cdi</artifactId>
    <version>${infinispan.version}</version>
</dependency>

Если вы хотите использовать поддержку аннотаций JCache, вам нужно включить перехватчики CDI (предоставляемые этим модулем) в вашем beans.xml. Больше информации здесь.

DZone: Можете ли вы привести пример того, как кэширование аннотаций помогает разработчикам?

Питер Мьюир / Кевин Поллет:  Вот пример без кеширования аннотаций:

public class UserDAO {

    private Cache<Long, User> cache;    

    public User findUser(long id){
       User user = cache.get(id);
       if ( user == null ) {
           user = …; // retrieve the user with the given id
           user.put(id, user);
       }
       return user;
    }

    public void storeUser(long id, User user){
       //  store the user with the given id
       // ...
       cache.put(id, user);
    }
 
    public void removeUser(long id){
       // remove the user with the given id
       // ...
       cache.remove(id);
    }

    public void removeAllUser(){
       // remove all user
       // ...
       cache.clear();
    }
}

В следующем DAO используются некоторые из кеширующих аннотаций, определенных в спецификации JCache, и он работает точно так же.

…
import javax.cache.interceptor.CacheResult;
import javax.cache.interceptor.CachePut;
import javax.cache.interceptor.CacheValue;
import javax.cache.interceptor.CacheRemoveEntry;
import javax.cache.interceptor.CacheRemoveAll;

public class UserDAO {

     // When this method is called:
     // - If the user with the given id is not in the cache, the method result is cached
     // - If an user with the given id is found in the cache, the intercepted method is not called and the cached
     //   result is returned.

     @CacheResult(cacheName="user-cache")
     public User findUser(long id) {
         User user = …; // retrieve the user with the given id
         return user;
     }
 
     // When this method is called the given user is cached with the given id as key. In all cases the intercepted method
     // is called.

     @CachePut(cacheName="user-cache")
     public void storeUser(long id, @CacheValue User user){
         //  store the user with the given id
         // ...
     }
          
     // When this method is called, the user with the given id will be removed from the cache. In all cases the intercepted
     // method is called.

     @CacheRemoveEntry(cacheName="user-cache")
     public void removeUser(long id){
         // remove the user with the given id
         // ...
     }

     // When this method is called, all entries in the cache will be removed. In all cases the intercepted
     // method is called.

     @CacheRemoveAll(cacheName="user-cache")
     public void removeAllUser(){
         // remove all user
         // ...
     }
}

Используя аннотации, нам удалось отделить ортогональные проблемы — бизнес-логику и тот факт, что она нуждается в кэшировании, что привело к созданию более чистого и более удобного в обслуживании кода.

DZone: Какие у тебя планы на будущее?

Питер Мьюир / Кевин Поллет:  Мы стремимся обеспечить поддержку предварительного просмотра JCache в Infinispan 5.2 в виде отдельного модуля. Это позволит ранним пользователям сразу же попробовать JCache. Затем мы планируем предоставить встроенную поддержку JCache в ядре Infinispan для Infinispan 6.

Кроме того, вы можете ожидать, что в скором времени появятся довольно интересные демонстрации CDI с Infinispan!