[英]Infinispan with Spring, casting from cache failing
我有Spring 1.4應用程序,該應用程序已部署到WildFly 10,它使用的是WildFly內置的Infinispan 8.1。
我已經設法正確部署了應用程序,這是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
我嘗試使用不同的類進行此操作,但沒有做任何事情,錯誤是相同的。 但是,我沒有從緩存簡單字符串的緩存中得到此錯誤。 是什么導致此問題?
這聽起來可能很可怕,但是在這種情況下,行為是正確的。
類始終綁定到特定的類加載器。 Wildfly使用模塊化的類加載器,每個部署使用不同的類加載器實例。 現在,假設您使用類加載器“ A”放置了類的某些實例,進行了重新部署(正在處理類加載器“ A”,並使用類加載器“ B”加載了新部署),並嘗試使用類加載器“ B”從緩存中讀取數據。 這些類加載器不匹配,並且出現例外情況com.dplesa.Class
無法轉換為com.dplesa.Class
。
有幾種方法可以解決此問題:
將Infinispan與您的應用程序infinispan-embedded
(例如,使用infinispan-embedded
工件)。 使用此技巧,Infinispan將使用與您的域類相同的類加載器進行加載。
將您的域類放在Wildfly模塊中。
分別部署Infinispan集群,並使用HotRod Client(例如,使用infinispan-remote
工件)連接到該集群。
解決方案#1最簡單,但是您需要注意重新部署期間集群所發生的事情(確保節點正確加入/離開集群,並根據需要復制數據等)。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.