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!