1

我的 Web 应用程序使用 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.jarServerCacheFeature所有其他东西都是服务器提供的。在 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);
}

那么......在JBoss Widlfy下使用infinispan启用和处理Resteasy Cache的正确方法是什么?

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

4

2 回答 2

1

我发现了问题:

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

两个战争都打包了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 的正确性。

于 2014-07-18T19:34:23.777 回答
1

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

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;
    }
}
于 2017-01-23T16:21:24.937 回答