簡體   English   中英

在沒有定位器運行的情況下啟動spring-data-gemfire

[英]Startup of spring-data-gemfire without locator running yet

我們在Java中有一個使用Gemfire和spring-data-gemfire的大型Web應用程序。 我們在客戶端服務器配置中運行gemfire。

我們遇到以下問題:在啟動期間,在bean連接階段,spring-data-gemfire想要連接到gemfire的定位器。 但是,定位器可能尚未啟動。 然后,應用程序將拋出com.gemstone.gemfire.cache.NoSubscriptionServersAvailableException: Primary discovery failed異常。

這導致我們的服務啟動過程緩慢且脆弱,這是不方便的,尤其是在我們的自動化測試期間。

是否有任何好的解決方案讓客戶端等待並定期輪詢直到定位器運行?

正如Jens D評論的那樣,您可以嘗試locator-wait-time GemFire(系統)屬性。 但是,正如文件指出的......

嘗試加入分布式系統時,如果定位器不可用,成員應等待定位器啟動的秒數。 當您一次啟動定位器和對等時,請使用此設置。 此超時允許對等方在嘗試加入分布式系統之前等待定位器完成啟動。

這具體是指加入分布式系統/集群的“對等成員”,因此可能對客戶端(緩存)沒有任何影響。

在這種情況下,我使用了其他使用Spring的技術(特別是在涉及客戶端/服務器拓撲的集成測試中),導致客戶端阻塞等待服務器(或定位器)變得可用。 在我的測試中,測試分支一個單獨的GemFire JVM進程來運行服務器,而測試VM用作緩存客戶端。

您可以通過將GemFire與Spring Session集成,特別是在httpsession-gemfire-clientserver示例中,在我最近的開發工作中看到這方面的示例。

在這里,我使用BeanPostProcessor導致客戶端緩存,特別是PoolFactoryBean / Pool,阻止(在postProcessBeforeInitialization(..) )阻止池完全初始化,直到服務器可用(也可以應用於Locator)。

等待只是嘗試打開與服務器 (或定位器) 的Socket連接以驗證連接。

另一種方法是創建一個CountDownLatch ,在注冊的GemFire ClientMembershipListener使用它,並再次將它與BeanPostProcessor相結合,這次只在postProcessAfterInitialization(..)方法中。

從技術上講,這兩種方法中只有一種是必要的。 雖然我將其用於測試目的,但它也可用於實際應用程序,並且在實際應用程序中也不常見。

但是,理想情況下,您首先要啟動Locator,因為形成一個集群取決於它。

希望這可以幫助。

干杯! 約翰

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM