Задача.
Надо подключить к проекту крутящемуся на 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:
Тоже самое можно проделать в панели управления WildFly, указав огромное множество параметров. (Сonfiguration: Subsystems->Subsystem: Infinispan->Cache Container: server)
2. Определяем в web.xml ресурс, для обращения к созданному cache. Причем в общем случае - сразу ресурс на именованный кэш нашего приложения. Можно обявить ресурсом CacheContainer и просить Cache по имени у него, но в общем случае эту работу лучше оставить серверу приложений. Не следует заботится о времени жизни ни контейнера, ни кэша. Для этого сесть WildFly.
3. Ни в коем случае не скачиваем и не подключаем библиотеки Infinispan. Если это удастся, то будут развернуты две системы: одна под управлением WildFly, а вторая под управлением приложения. Нет, нет и нет. Все что нужно, это экспортировать необходимые библиотеки из сервера приложений. Для этого правим манифест:
4. В приложении считываем ресурс.
Надо подключить к проекту крутящемуся на 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
Комментариев нет:
Отправить комментарий