2016-11-14 65 views
0

我有部署到WildFly 10的Spring 1.4应用程序,它使用内置于WildFly中的Infinispan 8.1。Infinispan with Spring,从缓存失败中投射

我已成功地正确地部署该应用程序,而这对于Infinispan的配置: 1)的CacheManager

@Bean 
public CacheManager cacheManager() throws Exception { 
    JndiTemplate jndiTemplate = new JndiTemplate(); 
    EmbeddedCacheManager embededCacheManager = (EmbeddedCacheManager) jndiTemplate.lookup("java:jboss/infinispan/container/CONTAINER"); 
    SpringEmbeddedCacheManager cacheManager = new SpringEmbeddedCacheManager(embededCacheManager); 
} 

2)的pom.xml

<dependency> 
    <groupId>org.infinispan</groupId> 
    <artifactId>infinispan-spring</artifactId> 
    <version>8.1.0.Final</version> 
    <exclusions> 
     <exclusion> 
      <groupId>org.springframework.boot</groupId> 
      <artifactId>spring-boot-starter-logging</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>javax.servlet</groupId> 
      <artifactId>servlet-api</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-core</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-jcl</artifactId> 
     </exclusion> 
     <exclusion> 
      <groupId>org.apache.logging.log4j</groupId> 
      <artifactId>log4j-slf4j-impl</artifactId> 
     </exclusion> 
    </exclusions> 
</dependency> 

<plugin> 
    <groupId>org.apache.maven.plugins</groupId> 
    <artifactId>maven-war-plugin</artifactId> 
    <configuration> 
     <archive> 
      <manifestEntries> 
       <Dependencies>org.infinispan, org.infinispan.commons, org.jboss.as.clustering.infinispan export</Dependencies> 
      </manifestEntries> 
     </archive> 
    </configuration> 
</plugin> 

当我部署的应用第一次一切正常。但是,高速缓存已经开始之后,当应用程序重新部署我使用缓存时收到以下错误:

java.lang.ClassCastException: com.dplesa.Class cannot be cast to com.dplesa.Class 

我试图与不同类别,没有母校我做什么,错误是一样的。但是,我并没有从缓存简单字符串的缓存中得到这个错误。什么可能导致这个问题?

+0

当我清除缓存时,在应用程序启动时,一切正常,但我不觉得这是一个很好的解决方案! – dplesa

回答

0

这听起来很可怕,但在这种情况下,行为是正确的。

一个类总是绑定到一个特定的类加载器。 Wildfly使用模块化类加载器,每个部署使用不同的类加载器实例。现在想象一下,你使用classloader'A'来放置你的类的一些实例,重新部署(classloader'A'被丢弃,并且使用classloader'B'加载新的部署)并尝试使用classloader'B'从缓存中读取数据。这些类别加载器不匹配,这会导致您的例外 - 类com.dplesa.Class不能转换为com.dplesa.Class

有几种方法来解决这个问题:(使用infinispan-embedded神器例如)

  1. Infinispan的嵌入您的应用程序。有了这个技巧,Infinispan将会加载与你的域类相同的类加载器。

  2. 将您的域类置于Wildfly模块中。

  3. 单独部署Infinispan集群并使用HotRod客户端连接到它(例如使用infinispan-remote工件)。

解决方案#1是最简单的,但你需要注意什么调动期间发生在您的集群(请确保您的节点加入/离开集群正确,您的数据复制,你的愿望等)。