2017-02-10 73 views
0

它使用的JCache和緩存的時候貌似默認春天開機自動配置將創建兩個hazelcast情況下啓用(@EnableCachingHazelcast和的JCache在春季啓動創建兩個實例

完整的示例在:https://github.com/dirkvanrensburg/hazelcast-springboot-jcache

TLDR; 有沒有辦法讓Spring Boot的自動配置只在通過JCache啓用緩存時創建一個Hazelcast實例?

<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到應用程序類,彈簧會自動配置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

+0

見https://github.com/hazelcast/hazelcast-code-samples/tree/master/hazelcast-integration/springboot-caching-jcache。您可以添加'@ EnableAutoConfiguration'註釋來排除Spring Boot的'HazelcastAutoConfigurtation'類並刪除您的'springHzProvider'方法。這不是一個理想的解決方案,但有點乾淨。 –

+0

謝謝,這工作,實際上更乾淨。我不需要將'HazelcastClientProxy'添加到類路徑中。 你明白這裏發生了什麼嗎?這可能是'CacheAutoConfiguration'中的一個錯誤嗎? 如果你想添加你的評論作爲答案,那麼我會接受它,因爲它解決了我的兩個問題(自定義緩存管理器,添加榛樹全部) – dvanrensburg

+0

我會首先提出它與Spring Boot的問題,並添加鏈接 –

回答

2

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

+0

謝謝尼爾。我找到了另一種方法來解決這個問題,並將其添加爲下面問題的二級答案 – dvanrensburg

1

我上面使用了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啓動之前創建此實例 的事實。

UPDATE 我從優秀的Spring Boot社區的@snicoll的幫助下找到了更好的解決方案。

只是明確地告訴Spring Boot哪個hazelcast配置使用並命名Hazelcast實例。把下面的application.propertiesspring.hazelcast.config=hazelcast.xml

舉個例子看看:https://github.com/dirkvanrensburg/hazelcast-springboot-jcache/tree/fixed