正确使用Spring Boot Hazelcast自动配置与@SpringAware MapLoader



我有一个项目使用Spring Boot 2.4.1Hazelcast 4.1.1. 我试图使用Spring Boot自动配置来设置一个分布式映射,通过使用jparerepository来填充该映射。我已经添加了application。Yaml hazelcast。yaml,并提供了com.hazelcast.map.MapLoadercom.hazelcast.map.MapLoaderLifecycleSupport注释@SpringAware的实现。hazelcast实例可以正常启动,但永远不会调用MapLoader。hazelcast文档只提供了Spring XML配置示例

  • 是否可以将Hazelcast的Spring启动自动配置与MapLoader,还是我需要自己提供com.hazelcast.config.MapConfigcom.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中,你可以注入工厂,并使用它在映射的映射存储配置对象上设置工厂实现。

这也可能是一个解决方案,虽然我还没有尝试过。

相关内容

  • 没有找到相关文章

最新更新