启动弹簧数据宝石火,尚未运行定位器



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

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

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

是否有任何好的解决方案可以让客户端等待并定期轮询直到定位器运行?

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

尝试加入分布式系统时,如果定位器不可用,成员应等待定位器启动的秒数。同时启动定位器和对等方时使用此设置。此超时允许对等方在尝试加入分布式系统之前等待定位器完成启动。

这特指加入分布式系统/集群的"对等成员",因此可能不受客户端(缓存)的任何影响。

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

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

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

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

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

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

但是,理想情况下,您先启动定位器,因为形成集群取决于它。

希望这有帮助。

干杯!John

最新更新