簡體   English   中英

Spring Boot中的Hazelcast和JCache創建兩個實例

[英]Hazelcast and JCache in Spring Boot creates two instances

使用JCache並啟用緩存后,默認的Spring boot自動配置看起來會創建兩個hazelcast實例( @EnableCaching

完整示例參見: https : //github.com/dirkvanrensburg/hazelcast-springboot-jcache

TLDR; 通過啟用JCache緩存時,是否有辦法讓Spring引導程序自動配置為僅創建一個Hazelcast實例?

我通過添加以下依賴項創建了一個演示Spring引導項目:

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
    </dependency>

    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-cache</artifactId>
    </dependency>

    <dependency>
        <groupId>javax.cache</groupId>
        <artifactId>cache-api</artifactId>
    </dependency>

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast</artifactId>
    </dependency>

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-spring</artifactId>
        <version>${hazelcast.version}</version>
    </dependency>

並將@EnableCaching添加到Application類,Spring將自動配置Hazelcast實例,但啟動兩個hazelcast實例,這些實例將加入集群,如日志所示:

Members [2] {
    Member [192.168.1.157]:5701 - 3eabbe90-6815-49ff-8d93-9e4b12e67810
    Member [192.168.1.157]:5702 - e9c93366-2408-4726-965a-b21dcf897113 this
}

緩存有效,但是我不希望有兩個Hazelcast實例。

哈克

我設法通過提供自己的緩存管理器使其工作:

@Bean
public CacheManager springHzProvider(HazelcastInstance instance) {
    return SpringHazelcastCachingProvider.getCacheManager(instance, null, new Properties());
}

並刪除hazelcasthazelcast-spring依賴性,並添加hazelcast-all

    <dependency>
        <groupId>com.hazelcast</groupId>
        <artifactId>hazelcast-all</artifactId>
        <version>${hazelcast.version}</version>
    </dependency>

但是問題仍然在於,是否有更好的“適當”方法來實現這一目標? 理想情況下,無需定義自定義緩存管理器並添加hazelcast-all

@dvanrensburg根據評論,作為臨時解決方案,將HazelcastAutoConfiguration類從自動配置中排除。 我已經記錄了Spring Boot https://github.com/spring-projects/spring-boot/issues/8275的問題,因為這是根本原因,如果@EnableCaching觸發了創建,則不應創建第二個實例第一。

我在上面使用了Neil的解決方案,但是遇到無法自動連接JCache配置創建的Hazelcast實例的情況。 看起來該實例是在Spring外部創建的,並已在應用程序上下文中注冊。

在配置中為實例命名

<instance-name>test</instance-name>

然后添加一個顯式鈎子以將實例帶入上下文

@Bean
public HazelcastInstance getInstance() {
    return Hazelcast.getHazelcastInstanceByName("test");
}

效果很好。 HazelcastAutoconfiguration無法運行,因為它對實例尚不存在條件。

我唯一擔心的是,這嚴重依賴於以下事實:對於Spring Boot的1.5.1版本,JCache配置會在HazelcastAutoconfiguration啟動之前創建該實例。

更新我在優秀的Spring Boot社區的@snicoll的幫助下找到了一個更好的解決方案。

只需明確告訴Spring Boot使用哪個hazelcast配置並命名Hazelcast實例即可。 將以下內容放在application.properties spring.hazelcast.config=hazelcast.xml

有關示例,請參見: https : //github.com/dirkvanrensburg/hazelcast-springboot-jcache/tree/fixed

暫無
暫無

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

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