gpt4 book ai didi

java - 在没有运行定位器的情况下启动 spring-data-gemfire

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:39:28 26 4
gpt4 key购买 nike

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

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

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

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

最佳答案

作为Jens D注释,您可以尝试使用 locator-wait-time GemFire (System) 属性。但是,作为 documentation指出...

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 的技术(特别是在涉及客户端/服务器拓扑的集成测试中)来导致客户端阻塞等待服务器(或定位器)变得可用。在我的测试中,测试 fork 了一个单独的 GemFire JVM 进程来运行服务器,同时测试 VM 用作缓存客户端。

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

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

wait只是 attempts to open a Socket connection to the Server (或定位器)来验证连通性。

另一种方法是create a CountDownLatch , 在 registered GemFire ClientMembershipListener 中使用它并再次将它与 BeanPostProcessor 组合,仅在 postProcessAfterInitialization(..) 中这次的方法。

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

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

希望这对您有所帮助。

干杯!约翰

关于java - 在没有运行定位器的情况下启动 spring-data-gemfire,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35790874/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com