Получение ресурса @в мой модуль Guice
Я видел различные фрагменты и фрагменты, но я либо приближаюсь к этому неправильно, либо немного не понимаю, что такое Guice. Я пытаюсь изменить / расширить этот модуль Cache4guice Infinispan, чтобы он мог получить доступ к встроенному модулю JBoss и в конечном итоге именованным кэшам в выбранном контейнере кэша.
Итак, у нас есть мой автономный.xml со следующим текстом:
<cache-container name="InfinispanCacheModule" default-cache="cache1" jndi-name="java:jboss/infinispan/container/mycachecontainer>
<local-cache name="cache1">
<eviction strategy="LRU" max-entries="1000"/>
<expiration max-idle="50000"/>
<file-store preload="true" passivation="true" purge="false"/>
</local-cache>
<local-cache name="cache2">
<eviction strategy="LRU" max-entries="500"/>
<expiration max-idle="20000"/>
<file-store preload="true" passivation="false" purge="false"/>
</local-cache>
Я изменил аннотацию @Cached, чтобы разрешить необязательный аргумент cachedName включенный. Идея в том, что вы можете использовать это для кэша по умолчанию:
@Cached
public someMethod(String someArg) {...}
Это для доступа к cache2 и далее...
@Cached(cacheName="cache2")
public someOtherMethod(String someArg) {...}
Единственные примеры, которые я нашел, которые, казалось бы, позволяют мне получить доступ к вещам, это такая мода, как использование ресурса jndi, например, на этой странице-ttp: / / my. safaribooksonline. com / book / web-development/9781590599976 / guice-recipes/integrating_jndi
Что заставляет меня попробовать что-то вроде этого:
public class InfinispanCacheModule extends CacheModule {
...
@Override
protected void configure() {
// bind naming context to the default InitialContext
bind(Context.class).to(InitialContext.class);
bind(CacheContainer.class).toProvider(JndiIntegration.fromJndi(CacheContainer.class, "java:jboss/infinispan/container/mycachecontainer"));
bindInterceptor(Matchers.any(), Matchers.annotatedWith(Cached.class), new CacheInterceptor(this));
}
Кроме того, из сообщений здесь и в другом месте, кажется, я мог бы использовать метод @Provides-в этом направлении: https://stackoverflow.com/a/8999548/880884 Guice: можно ли вводить модули?
Итак, теперь мы перейдем к конкретике, если мы посмотрим на исходный InfinispanModule, идея для меня состоит в том, чтобы либо передать CacheManager на создание модуля, либо создать его внутри модуля каким-то образом.
public class MyGuiceFactory {
private static final Injector inj = Guice.createInjector(
new SomeGuiceModule(),
new InfinispanCacheModule(---- what goes here? -----)
);
public static Injector getInjector() {
return inj;
}
}
Аналогичный вопрос: Spring, Infinispan и JBoss 7 интеграция
1 ответ:
Чтобы заставить это работать, я просто использовал обычный контекст и поиск. Я поместил следующий метод в свою фабрику Guice, а затем передал CacheContainer в InfinispanCacheModule через новый конструктор.
public static CacheContainer getCacheContainer() { org.infinispan.manager.CacheContainer container = null; try { Context ctx = new InitialContext(); container = (CacheContainer) ctx .lookup("java:jboss/infinispan/container/mycache"); } catch (NamingException e) { e.getCause(); } return container; }
Оттуда я смог использовать параметр аннотации 'cacheName' в инжекторе, а затем вернуться к методу getCache(String cacheName) InfinispanCacheModule. Если вы хотите, чтобы я поделился большим количеством кода repsond в этой теме, и я опубликую больше деталей.