Получение ресурса @в мой модуль 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 2

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 в этой теме, и я опубликую больше деталей.