簡體   English   中英

使用Spring的Infinispan,從緩存投射失敗

[英]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

有幾種方法可以解決此問題:

  1. 將Infinispan與您的應用程序infinispan-embedded (例如,使用infinispan-embedded工件)。 使用此技巧,Infinispan將使用與您的域類相同的類加載器進行加載。

  2. 將您的域類放在Wildfly模塊中。

  3. 分別部署Infinispan集群,並使用HotRod Client(例如,使用infinispan-remote工件)連接到該集群。

解決方案#1最簡單,但是您需要注意重新部署期間集群所發生的事情(確保節點正確加入/離開集群,並根據需要復制數據等)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM