有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何以编程方式启动Hazelcast TCP/IP接口?

在我的项目中,我有两台服务器运行一个应用程序。它们运行两个Hazelcast节点,它们被初始化为springbean。我使用Hibernate,Hazelcast也支持它的二级缓存。有一个分布式映射,它由一个映射加载器支持,该加载器在开始时对缓存进行初始化。如果两台服务器中的一台重新启动(节点B),则会发生以下情况:

  • 节点A看到节点B已离开,并定期尝试重新连接
  • 节点B开始初始化Spring上下文,在此期间,Hazelcast实例也会启动
  • 节点A连接节点B和一些迁移(?)操作命中节点B,节点B尝试获取上述映射
  • 同时,Spring初始化JPA实体管理器,该管理器也尝试访问映射(用于设置二级缓存)
  • 这会导致死锁:SpringInit线程持有与bean映射相关的锁并尝试获取分布式映射,而迁移操作持有映射并尝试从Spring获取MapLoaderbean

我的问题是,我无法控制Hazelcast何时第一次接受来自同行的连接

我的HZ bean定义如下:

@Bean
public void hazelcast() {
  Hazelcast.newInstance(config());
}

我迫不及待地接受连接,直到Spring完全启动。在我的应用程序完全启动之前,我找不到任何方法阻止Hazelcast进行操作

如何以编程方式启动Hazelcast TCP/IP网络接口?或者我如何拒绝连接?您能推荐一种无死锁模式来实现JPA的二级缓存,在启动时使用maploader bean进行缓存初始化,maploader bean也使用JPA加载特定的分布式映射吗


共 (1) 个答案

  1. # 1 楼答案

    我不明白为什么它会导致死锁,这听起来更像是一个bug。你能在邮件列表中提供一个小的演示程序来产生这个bug吗