Spring Boot + Hazelcast MapStore无法自动连线存储库

时间:2018-08-21 23:32:38

标签: spring spring-boot autowired hazelcast

我开始研究Hazelcast功能,并且一直在尝试通过HazelcastRepository将MapStore用作数据库的Write-Behind缓冲区。我的目标是在MapStore中使用JpaRepository来加载和存储缓存。

我使用的是Spring Boot,经过一些研究,我发现我可以使用@SpringAware在MapStore中自动装配我的存储库,但是每次到达那里,我的Bean都是null,我得到一个{{ 1}}。 即使经过许多不同的测试,我也无法正常工作,我无法在MapStore中自动装配我的bean

启用SpringAware的此配置有问题吗?还是我看错地方了?

找到了This stackoverflow post,它给了我一些线索,但是由于大多数配置都是xml而不是java,所以我仍然不知道这个问题。 也 在Github Issue中找到了有关如何通过Java配置在Hazelcast中配置SpringAware的信息

然后我在此Git Repo Here中提交了示例代码。

Debugger Screenshot null Bean

3 个答案:

答案 0 :(得分:2)

在研究了提供的代码之后,我发现根据我在Hazelcast上发现的GitHub问题,默认情况下从未默认启用@SpringAware。该问题描述了SpringAware已被禁用,因为它影响了性能,这使我进入了另一个封闭式解决方案,该解决方案使用 SpringManagedContext 通过代码启用注释(避免使用XML),但是并没有这样做仍然解决问题。

找到了真正的解决方案here,将 MapLoaderLifecycleSupport 接口添加到MapStore实现中,并实现票证中所示的init方法:

@Override
public void init(HazelcastInstance hazelcastInstance, Properties properties, String mapName) {
    hazelcastInstance.getConfig().getManagedContext().initialize(this);
}

这将强制在MapStore类中启用 @SpringAware ,因此,能够将任何spring组件自动连接到该类中,如下图所示。

working-jpa-repository-map-store-screenshot

答案 1 :(得分:1)

这里的问题是,当您使用pr自动接线时,您正在创建名称为personRepository的spring bean。

pr中将personRepository更改为PersonRepository.java 或者从("pr")

中删除PersonRepository.java
@Autowired
PersonRepository personRepository; 

DAO

@Repository("pr")
public interface PersonRepository extends JpaRepository<Person, Integer> {

    @Query("SELECT id FROM Person")
    Iterable<Integer> findAllId();
}

答案 2 :(得分:0)

将MapStore bean懒惰地注入到您初始化地图的类中也可以:

    @Inject
    HazelcastConfiguration(@Lazy MyMapStore myMapStore) {
        this.myMapStore = myMapStore;
    }

在此示例中,MyMapStore bean包含注入的MyRepository bean。