关于 java:spring-data-gemfire 的启动但没有运行定位器

Startup of spring-data-gemfire without locator running yet

我们有一个使用 Gemfire 和 spring-data-gemfire 的 Java 大型 Web 应用程序。我们在客户端服务器配置中运行 gemfire。

我们遇到如下问题:启动过程中,在bean连线阶段,spring-data-gemfire要连接gemfire的定位器。但是,定位器可能尚未启动。然后应用程序将抛出 com.gemstone.gemfire.cache.NoSubscriptionServersAvailableException: Primary discovery failed 异常。

这会导致我们的服务启动过程缓慢而脆弱,这很不方便,尤其是在我们的自动化测试期间。

有什么好的解决方案让客户端等待并定期轮询直到定位器运行?


正如 Jens D 评论的那样,您可以尝试 locator-wait-time GemFire (System) 属性。但是,正如文档指出的那样......

The number of seconds that a member should wait for a locator to start if a locator is not available when attempting to join the distributed system. Use this setting when you are starting locators and peers all at once. This timeout allows peers to wait for the locators to finish starting up before attempting to join the distributed system.

这具体指的是一个"对等成员"加入分布式系统/集群,因此,可能对客户端(缓存)没有任何影响。

在这种情况下,我使用了其他使用 Spring 的技术(特别是在涉及客户端/服务器拓扑的集成测试中),以使客户端阻塞等待服务器(或定位器)可用。在我的测试中,测试分叉了一个单独的 GemFire JVM 进程来运行服务器,而测试 VM 充当缓存客户端。

您可以在我最近通过将 GemFire 与 Spring Session 集成的开发工作中看到这方面的示例,特别是在 httpsession-gemfire-clientserver 示例中。

在这里,我使用了一个 BeanPostProcessor,它会导致客户端缓存,特别是 PoolFactoryBean/Pool,阻止(在 postProcessBeforeInitialization(..) 中)阻止池在服务器可用之前完全初始化(也可以应用于定位器)。

等待只是尝试打开到服务器(或定位器)的套接字连接以验证连接。

另一种方法是创建一个 CountDownLatch,在已注册的 GemFire ClientMembershipListener 中使用它,并再次将其与 BeanPostProcessor 组合,这次仅在 postProcessAfterInitialization(..) 方法中。

从技术上讲,这两种方法中只有一种是必需的。虽然,我将它用于测试目的,但它也可以用于实际应用程序,并且在实际应用程序中并不少见。

然而,理想情况下,您首先启动定位器,因为形成一个集群取决于它。

希望这会有所帮助。

干杯!
约翰