【问题标题】:Startup of spring-data-gemfire without locator running yet在没有运行定位器的情况下启动 spring-data-gemfire
【发布时间】:2016-03-04 08:01:12
【问题描述】:

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

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

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

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

【问题讨论】:

  • 您可能想尝试设置 GemFire 属性 locator-wait-time。我相信这是在 8.1 中引入的,它允许服务器等待指定的时间让定位器可用。

标签: java spring gemfire spring-data-gemfire


【解决方案1】:

作为Jens D cmets,您可以尝试locator-wait-time GemFire(系统)属性。然而,正如documentation 指出的那样......

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

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

在这种情况下,我使用了其他使用 Spring 的技术(特别是在涉及客户端/服务器拓扑的集成测试中),以使客户端阻塞等待服务器(或定位器)可用。在我的测试中,测试分叉了一个单独的 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(..) 方法中。

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

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

希望这会有所帮助。

干杯! 约翰

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-03-04
    • 1970-01-01
    • 2013-05-11
    • 1970-01-01
    • 2021-03-12
    • 2022-08-14
    • 2023-04-04
    相关资源
    最近更新 更多