Social Icons

.

воскресенье, 5 ноября 2017 г.

Infinispan для Wildfly

Задача.
Надо подключить к проекту крутящемуся на WildFly 11 "in-memory key/value data store"  и пользоваться им из JEE компонентов.
Ограничения.
Не рассматриваем вопросы, почему нас не устраивает Map, не рассматриваем вопросы кластеризации. Только запуск и подключение локального хранилица.
Решение.
Infinispan  входит в поставку WildFly, так что ей и будем пользоваться. В качестве data-grid большего не требуется.

 1. Прописываем в standalone.xml конфигурацию собственного хранилища. (разумеется, необходимо перейти на standalone-full.xml). Для этого, в разделе подсистемы infinispan  (что-то вроде <subsystem xmlns="urn:jboss:domain:infinispan:4.0>) выбираем понравившийся cache-container и прописываем в нем свой Cache. Например, для myProject:

...
<cache-container default-cache="default" module="org.wildfly.clustering.server" name="server">
    <local-cache name="default">
        <transaction mode="BATCH">
    </transaction></local-cache>
    <local-cache name="myProject" jndi-name="infinispan/LocalCacheMyProject" >
        <transaction mode="BATCH">
    </transaction></local-cache>
</cache-container>
...
Что тут важно: собствено создать cache и присвоить ему jndi имя, по которому мы будем его искать.
Тоже самое можно проделать в панели управления WildFly, указав огромное множество параметров. (Сonfiguration: Subsystems->Subsystem: Infinispan->Cache Container: server)

2. Определяем в web.xml ресурс, для обращения к созданному cache. Причем в общем случае - сразу ресурс на именованный кэш нашего приложения. Можно обявить ресурсом CacheContainer и просить Cache по имени у него, но в общем случае эту работу лучше оставить серверу приложений. Не следует заботится о времени жизни ни контейнера, ни кэша. Для этого сесть WildFly.

<resource-env-ref>  
    <resource-env-ref-name>LocalCacheMyProject</resource-env-ref-name>  
    <resource-env-ref-type>org.infinispan.Cache</resource-env-ref-type>
    <lookup-name>java:jboss/infinispan/LocalCacheMyProject</lookup-name>  
</resource-env-ref>

3. Ни в коем случае не скачиваем и не подключаем библиотеки Infinispan. Если это удастся, то будут развернуты две системы: одна под управлением WildFly, а вторая под управлением приложения. Нет, нет и нет. Все что нужно, это экспортировать необходимые библиотеки из сервера приложений. Для этого правим манифест:

Manifest-Version: 1.0
Class-Path: 
Dependencies: org.infinispan, org.infinispan.commons, org.jboss.as.clustering.infinispan export

4. В приложении считываем ресурс.

@Resource(name = "LocalCacheMyProject")
Cache<Object, Object> theCache;

5. Это, в целом, все. Но можно сделать контрольный пример. В каком-то методе что-то вроде:

import org.infinispan.Cache;
...
private static int nValue = 0; 
private void infinispan(){
 try {
  theCache.put("hello-" + nValue, "world");   
  log.info( String.valueOf( theCache.size() ) );
  log.info( theCache.get("hello-" + nValue).toString() );
  nValue++;
 }
 catch(Exception ex) {
  log.info( ex.getMessage() );
 }  
}


Еще несколько примеров. Они более характерны для систем без сервера приложений, но мало ли, что в жизни пригодится.


import org.infinispan.*;
import org.infinispan.configuration.global.GlobalConfigurationBuilder;
import org.infinispan.manager.CacheContainer;
import org.infinispan.manager.DefaultCacheManager;
import org.infinispan.configuration.cache.Configuration;
import org.infinispan.Cache;
...
private void infinispan_No1(){
 try {
  DefaultCacheManager theCacheManager = new DefaultCacheManager();   
  Cache theCache = theCacheManager.getCache();
  
  theCache.put("hello", "world");   
  log.info( String.valueOf( theCache.size() ) );
  log.info( theCache.get("hello") );
  
  theCache.stop();
  theCacheManager.stop();
 }
 catch(Exception ex) {
  log.info( ex.getMessage() );
 }  
}

private void infinispan_No2(){
 try {
  GlobalConfigurationBuilder global = GlobalConfigurationBuilder.defaultClusteredBuilder();
  DefaultCacheManager theCacheManager = new DefaultCacheManager(global.build() );
  
  Cache theCache = theCacheManager.getCache();
  theCache.put("hello", "world");   
  log.info( String.valueOf( theCache.size() ) );
  log.info( theCache.get("hello") );
  theCache.stop();
  theCacheManager.stop();
 }
 catch(Exception ex) {
  log.info( ex.getMessage() );
 }  
}

private static int nValue = 0; 
private void infinispan_No3(){
 try {
  Context context = new InitialContext();  
  CacheContainer theCacheContainer = (CacheContainer) context.lookup("java:comp/env/infinispan/myProjectContainer"); 
  Cache theCache = theCacheContainer.getCache("myProject");
  
  theCache.put("hello-" + nValue, "world");   
  log.info( String.valueOf( theCache.size() ) );
  log.info( theCache.get("hello-" + nValue).toString() );
  nValue++;
  //theCache.stop();
 }
 catch(Exception ex) {
  log.info( ex.getMessage() );
 }  
}

infinispan.org
apidocs
user guide
server guide
examples


Комментариев нет:

Отправить комментарий

 

Так говорил Учитель:

У хорошо написанной программы есть свой собственный рай, у плохо написанной — свой собственный ад.

Russian Developer

Взгляд его светел, усилия праведны, старания бесплодны, дело безнадежно ...