【发布时间】:2017-02-10 04:35:34
【问题描述】:
看起来默认的 Spring boot 自动配置会在使用 JCache 并启用缓存时创建两个 hazelcast 实例 (@EnableCaching)
完整示例位于:https://github.com/dirkvanrensburg/hazelcast-springboot-jcache
TLDR; 当通过 JCache 启用缓存时,有没有办法让 Spring boot 的自动配置只创建一个 Hazelcast 实例?
我通过添加以下依赖项创建了一个演示 Spring Boot 项目:
<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
【问题讨论】:
-
见github.com/hazelcast/hazelcast-code-samples/tree/master/…。您可以添加
@EnableAutoConfiguration注释以排除 Spring Boot 的HazelcastAutoConfigurtation类并删除您的springHzProvider方法。这不是一个理想的解决方案,但更清洁。 -
谢谢,这行得通,实际上更干净。我不必将
HazelcastClientProxy添加到类路径中。你明白这里发生了什么吗?这可能是CacheAutoConfiguration中的错误吗?如果您想添加您的评论作为答案,那么我会接受它,因为它解决了我的两个问题(自定义缓存管理器,添加 hazelcast-all) -
我先将它作为 Spring Boot 的问题提出,然后添加链接
-
只是一个后续问题,该问题现已得到修复,并将在 Spring Boot 时可用
1.5.3.RELEASE
标签: java caching spring-boot hazelcast jcache