Мое веб-приложение использует 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 диспетчера кэша.