在JBoss Wildfly下启用Rest缓存

在JBoss Wildfly下启用Rest缓存,jboss,resteasy,wildfly,infinispan,wildfly-8,Jboss,Resteasy,Wildfly,Infinispan,Wildfly 8,我的web应用程序使用Resteasy和Infinispan缓存 我们的设置在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.

我的web应用程序使用Resteasy和Infinispan缓存

我们的设置在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工作的步骤

一些Rest方法使用注释org.jboss.resteasy.annotations.cache.cache。例如:

@GET
@Path("/actions")
@Cache(maxAge = 3600)
@Produces(value = { APPLICATION_XML, APPLICATION_JSON })
public Action[] getActions() {
    ...
}
要启用缓存,请在应用程序对象上添加缓存功能:

@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;
}
所以。。。在JBoss Widlfy下使用infinispan启用和处理Resteasy缓存的正确方法是什么

更新:事实上,我有两次关于缓存的部署配置相同的战争。只有缓存管理器JNDI名称不同。

我发现了问题:

我有两场战争,都有自己的缓存配置

两个WAR都打包了resteasy-cache-core.jar。因为两个类加载器都是模块隔离的,所以我们最终得到了两个InfinispanCache类定义,每个类加载器都有一个onde

解决方案是将resteasy-cache-core.jar部署为一个模块,并在wars 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的正确用法。

我将以下内容用于EAP/Wildfly。不是:我还需要web.xml中的restesybootstrap条目

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;
    }
}
公共类jaxractivator扩展应用程序{
@资源(lookup=“java:jboss/infinispan/container/web”)私有嵌入式缓存管理器;
@重写公共集GetSingleton(){
Set objects=new HashSet();
Cache Cache=manager.getCache(“rest”);
添加(新的ServerCacheFeature(新的InfinispanCache(缓存));
归还物品;
}
}
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;
    }
}