[英]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.