当前位置: 首页 > 知识库问答 >
问题:

带有Spring Boot数据的Hazelcast MapStore JPA循环依赖

黄弘盛
2023-03-14

我正在使用Spring Boot数据jpa和hazelcast开发Spring Boot 2.4.1项目。我正试图建立一个分布式地图,并读取数据库。我已经实现了com。黑兹卡斯特。地图MapLoader,但当我尝试运行应用程序时,由于循环依赖关系,它无法启动。似乎JpaRepository需要HazelcastInstance首先可用,但HazelcastInstance需要MapLoader,MapLoader反过来需要JpaRepository准备就绪。至少从日志和这篇文章来看是这样的。

有人知道如何解决这个问题吗?

波姆。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>

配置:

@Configuration
public class HZConfig {
    
    @Bean
    Config config(RVOLoader rvoLoader) {}
        Config config = new Config();
        config.getMapConfig("rvoMap").getMapStoreConfig().setImplementation(rvoLoader);
        config.getMapConfig("rvoMap").getMapStoreConfig()
            .setInitialLoadMode(MapStoreConfig.InitialLoadMode.EAGER);

        return config;
    }

    @Bean
    HazelcastInstance hazelcastInstance(Config config) {
        HazelcastInstance hz = Hazelcast.newHazelcastInstance(config);
        return hz;
    }
}

地图加载器:

@Component
public class MyResourceMapLoader implements MapLoader<Long, MyResource> {
    
    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();
    }
}   

JpaRepository:

java prettyprint-override">@Repository
public interface MyResourceRepository extends JpaRepository<MyResource, Long> {

    List<MyResource> findAll();

    @Query("SELECT m.id from MyResource m")
    Iterable<Long> findAllIds();

}

共有1个答案

庄博厚
2023-03-14

一个解决方案,

@Bean
public Config config(YourMapStoreFactory yourMapStoreFactory) {
    ...
    config.getMapConfig("rvoMap").getMapStoreConfig().setFactoryImplementation(yourMapStoreFactory);

使地图存储工厂成为组件,而不是地图存储

@Component
public class YourMapStoreFactory implements MapStoreFactory {

    @Autowired
    private MyResourceRepository repo;

    public MapLoader newMapStore(String mapName, Properties properties) {
        if (mapName.equals("rvoMap") {
            return new MyResourceMapLoader(repo);
 类似资料:
  • 问题内容: 我正在尝试使用jQuery的循环来遍历此JSON并将其添加到named中。JSON如下: 我通过使用以下代码获取此JSON: 有什么办法吗? 问题答案: 尝试(未试用): 我想了三个独立的循环,因为您可能希望对每个数据集进行不同的处理(justIn,recent,old)。如果没有,您可以执行以下操作:

  • 本文向大家介绍带有@Transactional和@Async的循环依赖问题的解决,包括了带有@Transactional和@Async的循环依赖问题的解决的使用技巧和注意事项,需要的朋友参考一下 今天我们来探讨一个有意思的spring源码问题,也是一个学生告诉了我现象我从源码里面找到了这个有意思的问题。 首先我们看service层的代码案例,如下: 在transation方法上面加上了@Trans

  • 我在用Guice辅助注射。下面是一个标准场景: 现在,我可以使用Guice factory调用,并通过Guice注入的实例轻松获得我的实例。 我的问题是:如果我希望引用正在创建的的实例,该怎么办?换句话说,我想要: 我当前的解决办法相当难看:我手动创建了一个,而不使用,然后使用获取实例,并在实例上调用方法。啊!

  • 我正在尝试填充一个名为的组件中的数组,它是的数组。每个还有一个列表。 因此,目前,我正在处理两个api调用,它们是: 和 我使用获取所有进程,并首先填充数组。然后我使用每个的进程id来调用第二个API,以获取该进程的任务。 当前,我的代码看起来如下所示: 我知道我可以创建一个observables数组,并使用等待所有这些异步调用完成,但我希望能够为每个调用定义订阅回调函数,因为我需要对的引用。我有

  • 问题内容: 我需要创建一个包含100个数字(1-100)的数组,然后计算所有数字将是多少(1 + 2 + 3 + 4 + .. + 100 =总和)。 我不想手动将这些数字输入到数组中,因为要花100个点才能花费一些时间,并且花费更多的代码。 我在想像使用变量++直到100,然后计算所有这些的总和。不知道将如何写。但是,它在数组中很重要,因此我以后也可以说“数组55多少钱”,我可以很容易地看到它。

  • 对Java来说很新鲜,我在大学的一个入门班做一个项目。我正在尝试做一个方法,在String数组中搜索输入的状态并返回索引。如果用户输入不在数组中的查询,我希望它要求一个新的状态来搜索。我的例外是说“变量statePotion可能尚未初始化。”下面是代码。 提前谢谢!