2014-07-18 54 views
1

我的web應用程序使用Resteasy和Infinispan緩存。在JBoss Wildfly下啓用Rest緩存

我們的設置在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下,我們內部的戰爭打包的唯一依賴是RestEasy的緩存-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() { 
    ... 
} 

要啓用緩存我添加緩存功能,在適用對象:

@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; 
} 

最後我用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); 
} 

所以注入org.infinispan.manager.CacheContainer ...什麼是正確的在JBoss Widlfy下使用infinispan啓用和處理Resteasy Cache的方法?

更新:事實上,我有兩場戰爭與緩存相同的部署配置。只有緩存管理器的JNDI名稱不同。

回答

1

我發現問題:

我有兩場戰爭,都有自己的緩存配置。

兩次戰爭都打包resteasy-cache-core.jar。由於這兩個類加載器都是模塊隔離的,我們最終得到了兩個InfinispanCache類定義,分別用於每個類加載器。

解決方案是將resteasy-cache-core.jar作爲模塊部署並在戰爭MANIFEST.MF文件中聲明爲依賴項。

要創建給出的罐子模塊:

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" 

**更新:經過一段時間的錯誤再次發生。我們將會看得更遠。 Definitelly我們的方法適用於像Jetty和Tomcat這樣的容器。 我們將研究Wild correct的正確性。

0

我對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; 
    } 
}