正确使用 Spring Boot Hazelcast Auto-Configuration with @SpringAware MapLoader
Correct Use of Spring Boot Hazelcast Auto-Configuration with @SpringAware MapLoader
我有一个项目使用 Spring Boot 2.4.1 和 Hazelcast 4.1.1。我正在尝试使用 Spring 引导自动配置来设置分布式地图,并使用 JpaRepository 来填充地图。我添加了 application.yaml 和 hazelcast.yaml 并提供了 com.hazelcast.map.MapLoader
和 [=16= 的实现] 注释为 @SpringAware
。一个 hazelcast 实例启动正常,但 MapLoader 从未被调用。 hazelcast 文档仅提供 Spring XML 配置示例
- 是否可以将 Spring Hazelcast 的引导自动配置与
MapLoader,或者我需要提供我自己的
com.hazelcast.config.MapConfig
和 com.hazelcast.config.Config
豆子?
- 如何将
@SpringAware
与 MapLoader 一起使用?
- init 方法中应该包含哪些内容?
- 我是否需要注册 Spring 上下文
Hazelcast 上下文?
如果您能提供任何指导,我们将不胜感激。以下是我到目前为止所做的尝试:
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-all</artifactId>
<version>4.1.1</version>
</dependency>
application.yaml:
# datasource and JPA config omitted
spring:
hazelcast:
config: classpath:hazelcast.yaml
hazelcast.yaml
hazelcast:
cluster-name: hazelcast-cluster
map:
myResourceMap:
map-loader:
enabled: true
initial-mode: EAGER
class-name: com.dev.hz.MyResourceMaploader
MapLoader 实现:
@SpringAware
public class MyResourceMapLoader implements MapLoader<Long, MyResource>, MapLoaderLifecycleSupport {
private final MyResourceRepository repo;
public MyResourceMapLoader(MyResourceRepository repo) {
this.repo = repo;
}
@Override
public MyResource load(Long key) {
return this.repo.findById(key).orElse(null);
}
@Override
public Map<Long, MyResource> loadAll(Collection<Long> keys) {
Map<Long, MyResource> myResourceMap = new HashMap<>();
for (Long key : keys) {
MyResource myResource = this.load(key);
if (myResource != null) {
myResourceMap.put(key, myResource);
}
}
return myResourceMap;
}
@Override
public Iterable<Long> loadAllKeys() {
return this.repo.findAllIds();
}
@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
}
@Override
public void destroy() {
}
}
一种方法是让 @Component
class 实现 MapStoreFactory
。工厂需要执行:
MapLoader newMapStore(String mapName, Properties properties)
并且可以使用映射名称来查找相关的 bean。
然后在您的 @Configuration
中您可以注入工厂,并使用它在地图的地图存储配置对象上设置工厂实现。
也可能是一个解决方案,虽然我没有尝试过。
我有一个项目使用 Spring Boot 2.4.1 和 Hazelcast 4.1.1。我正在尝试使用 Spring 引导自动配置来设置分布式地图,并使用 JpaRepository 来填充地图。我添加了 application.yaml 和 hazelcast.yaml 并提供了 com.hazelcast.map.MapLoader
和 [=16= 的实现] 注释为 @SpringAware
。一个 hazelcast 实例启动正常,但 MapLoader 从未被调用。 hazelcast 文档仅提供 Spring XML 配置示例
- 是否可以将 Spring Hazelcast 的引导自动配置与
MapLoader,或者我需要提供我自己的
com.hazelcast.config.MapConfig
和com.hazelcast.config.Config
豆子? - 如何将
@SpringAware
与 MapLoader 一起使用? - init 方法中应该包含哪些内容?
- 我是否需要注册 Spring 上下文 Hazelcast 上下文?
如果您能提供任何指导,我们将不胜感激。以下是我到目前为止所做的尝试:
pom.xml:
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.4.1</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
...
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
<groupId>com.hazelcast</groupId>
<artifactId>hazelcast-all</artifactId>
<version>4.1.1</version>
</dependency>
application.yaml:
# datasource and JPA config omitted
spring:
hazelcast:
config: classpath:hazelcast.yaml
hazelcast.yaml
hazelcast:
cluster-name: hazelcast-cluster
map:
myResourceMap:
map-loader:
enabled: true
initial-mode: EAGER
class-name: com.dev.hz.MyResourceMaploader
MapLoader 实现:
@SpringAware
public class MyResourceMapLoader implements MapLoader<Long, MyResource>, MapLoaderLifecycleSupport {
private final MyResourceRepository repo;
public MyResourceMapLoader(MyResourceRepository repo) {
this.repo = repo;
}
@Override
public MyResource load(Long key) {
return this.repo.findById(key).orElse(null);
}
@Override
public Map<Long, MyResource> loadAll(Collection<Long> keys) {
Map<Long, MyResource> myResourceMap = new HashMap<>();
for (Long key : keys) {
MyResource myResource = this.load(key);
if (myResource != null) {
myResourceMap.put(key, myResource);
}
}
return myResourceMap;
}
@Override
public Iterable<Long> loadAllKeys() {
return this.repo.findAllIds();
}
@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
}
@Override
public void destroy() {
}
}
一种方法是让 @Component
class 实现 MapStoreFactory
。工厂需要执行:
MapLoader newMapStore(String mapName, Properties properties)
并且可以使用映射名称来查找相关的 bean。
然后在您的 @Configuration
中您可以注入工厂,并使用它在地图的地图存储配置对象上设置工厂实现。