[英]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());
}
並刪除hazelcast
和hazelcast-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.