0

我有一个使用Spring Boot 2.4.1Hazelcast 4.1.1的项目。我正在尝试使用 Spring Boot 自动配置来设置分布式地图,并使用 JpaRepository 读取来填充地图。我添加了application.yamlhazelcast.yaml并提供了一个实现com.hazelcast.map.MapLoadercom.hazelcast.map.MapLoaderLifecycleSupport@SpringAware. hazelcast 实例启动正常,但从未调用 MapLoader。hazelcast 文档仅提供 Spring XML 配置示例

  • 是否可以将 Hazelcast 的 Spring Boot 自动配置与 MapLoader 结合使用,还是我需要提供自己的 com.hazelcast.config.MapConfigcom.hazelcast.config.Config bean?
  • 如何使用@SpringAwareMapLoader?
  • init 方法中应该包含什么?
  • 我需要用 Hazelcast 上下文注册 Spring 上下文吗?

您可以提供的任何指导将不胜感激。以下是我到目前为止所尝试的:

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>

应用程序.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

地图加载器实现:

@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() {

    }
}   
4

1 回答 1

2

一种方法是拥有一个@Component实现MapStoreFactory. 工厂需要执行:

MapLoader newMapStore(String mapName, Properties properties)

并且可以使用地图名称找到相关的bean。

然后在你的@Configuration你可以注入工厂,并使用它在地图的地图存储配置对象上设置工厂实现。

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

于 2021-01-15T13:16:26.600 回答