我有一个项目使用Spring Boot 2.4.1Hazelcast 4.1.1. 我试图使用Spring Boot自动配置来设置一个分布式映射,通过使用jparerepository来填充该映射。我已经添加了application。Yaml 和hazelcast。yaml,并提供了com.hazelcast.map.MapLoader
和com.hazelcast.map.MapLoaderLifecycleSupport
注释@SpringAware
的实现。hazelcast实例可以正常启动,但永远不会调用MapLoader。hazelcast文档只提供了Spring XML配置示例
- 是否可以将Hazelcast的Spring启动自动配置与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() {
}
}
一种方法是使用实现MapStoreFactory
的@Component
类。工厂需要实现:
MapLoader newMapStore(String mapName, Properties properties)
,可以使用映射名称查找相关bean。
然后在你的@Configuration
中,你可以注入工厂,并使用它在映射的映射存储配置对象上设置工厂实现。
这也可能是一个解决方案,虽然我还没有尝试过。