Включение кеша Rest в JBoss Wildfly

Мое веб-приложение использует Resteasy и Infinispan Cache.

Наша установка отлично работает в Jetty, но теперь нам нужно выполнить развертывание в JBoss Wildfly 8.1.0.

В Wildfly у нас периодически возникает ошибка после некоторых запросов:

java.lang.ClassCastException: org.jboss.resteasy.plugins.cache.server.InfinispanCache$CacheEntry cannot be cast to org.jboss.resteasy.plugins.cache.server.InfinispanCache$CacheEntry
    at org.jboss.resteasy.plugins.cache.server.InfinispanCache.get(InfinispanCache.java:85)
    at org.jboss.resteasy.plugins.cache.server.ServerCacheHitFilter.handleGET(ServerCacheHitFilter.java:53)
    at org.jboss.resteasy.plugins.cache.server.ServerCacheHitFilter.filter(ServerCacheHitFilter.java:38)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invokeOnTarget(ResourceMethodInvoker.java:256)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:242)
    at org.jboss.resteasy.core.ResourceMethodInvoker.invoke(ResourceMethodInvoker.java:229)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:356)
    at org.jboss.resteasy.core.SynchronousDispatcher.invoke(SynchronousDispatcher.java:179)
    at org.jboss.resteasy.plugins.server.servlet.ServletContainerDispatcher.service(ServletContainerDispatcher.java:220)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:56)
    at org.jboss.resteasy.plugins.server.servlet.HttpServletDispatcher.service(HttpServletDispatcher.java:51)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:847)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:329)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)
    at org.jboss.weld.servlet.ConversationPropagationFilter.doFilter(ConversationPropagationFilter.java:62)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:280)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:248)

Обратите внимание, что под Widlfly единственная зависимость, которую мы упаковываем внутри war, - это resteasy-cache-core.jar, где принадлежит ServerCacheFeature, все остальное предоставляется сервером. Под Jetty нам нужно все упаковать.

Ниже описано, что мы делаем для работы в Jetty.

Некоторые методы Rest используют аннотацию org.jboss.resteasy.annotations.cache.Cache. Например:

@GET
@Path("/actions")
@Cache(maxAge = 3600)
@Produces(value = { APPLICATION_XML, APPLICATION_JSON })
public Action[] getActions() {
    ...
}

Чтобы включить кеш, я добавляю функцию кеширования в объект Application:

@Inject
private CacheContainer cacheContainer;

@Override
public Set<Object> getSingletons() {
    Set<Object> objects = getDefaultProviders();

    Cache<Object, Object> cache = cacheContainer.getCache("rest");
    objects.add(new ServerCacheFeature(new InfinispanCache(cache)));

    return objects;
}

Наконец, я ввожу org.infinispan.manager.CacheContainer с помощью CDI и получаю CacheContainer

// There's a cache manager deployed in this JNDI name in standlone.xml/jetty.xml
public static final String CACHE_MANAGER_JNDI_NAME = "java:/application/cachemanager/MyCacheManager";

@Produces
@ApplicationScoped
public CacheContainer createCacheManager() {
    return DependencyContext.getFromJndi(CACHE_MANAGER_JNDI_NAME, CacheContainer.class);
}

Итак ... как правильно включить и обработать Resteasy Cache с использованием infinispan под JBoss Widlfy?

update: на самом деле у меня две войны с одинаковой конфигурацией развертывания в отношении кеша. Различаются только имена JNDI диспетчера кэша.


person ivan.aguirre    schedule 18.07.2014    source источник


Ответы (2)


Я нашел проблему:

У меня две войны, обе со своими конфигурациями кеша.

Обе войны содержат пакет resteasy-cache-core.jar. Поскольку оба загрузчика классов изолированы от модулей, мы получаем два определения класса InfinispanCache, по одному для каждого загрузчика классов.

Решение состоит в том, чтобы развернуть resteasy-cache-core.jar как модуль и объявить его как зависимость в файлах WAR MANIFEST.MF.

Чтобы создать модуль с учетом jar:

jboss-cli.sh --connect --command="module add --name=org.jboss.resteasy.cachecore --dependencies=org.infinispan,org.jboss.resteasy,org.jboss.resteasy.resteasy-jaxrs,javax.ws.rs.api --resources=resteasy-cache-core-3.0.8.Final.jar"

** Обновление: через некоторое время ошибка возникает снова. Будем смотреть дальше. Определенно наш подход подходит для таких контейнеров, как Jetty и Tomcat. Мы собираемся исследовать правильный вариант для Wildfly.

person ivan.aguirre    schedule 18.07.2014

Я использовал следующее для EAP / Wildfly. Не: мне также нужна была запись начальной загрузки Restesy в web.xml

public class JaxRsActivator extends Application {
    @Resource(lookup ="java:jboss/infinispan/container/web") private EmbeddedCacheManager manager;
    @Override public Set<Object> getSingletons() {
        Set<Object> objects = new HashSet<>();
        Cache<Object, Object> cache = manager.getCache("rest");
        objects.add(new ServerCacheFeature(new InfinispanCache(cache)));
        return objects;
    }
}
person Will T    schedule 23.01.2017