2016-03-04 79 views
2

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

我們有以下問題:在啓動過程中,在bean佈線階段,彈簧數據的GemFire要連接到的GemFire的定位。但是,定位器可能還沒有啓動。然後該應用程序將拋出一個com.gemstone.gemfire.cache.NoSubscriptionServersAvailableException: Primary discovery failed異常。

這使我們服務的緩慢和脆弱的啓動過程,這是不方便的,尤其是在我們的自動化測試。

有什麼好的解決方案讓客戶端等待,並定期輪詢,直到定位器運行?

+1

您可能想嘗試設置GemFire屬性'locator-wait-time'。我相信這是在8.1中引入的,並且允許服務器等待指定時間以使定位器可用。 –

回答

3

由於Jens D評論,你可以嘗試locator-wait-time的GemFire(系統)屬性。然而,隨着documentation指出...

的秒成員應該等待一個定位器開始,如果試圖加入分佈式系統時的定位是不可用的次數。當您一次啓動定位器和同位體時使用此設置。此超時允許對等方在嘗試加入分佈式系統之前等待定位器完成啓動。

具體指的是加入分佈式系統/集羣的「對等成員」,因此可能對客戶端(高速緩存)沒有任何影響。

使用Spring

在這種情況下,我已經採用的其它技術(具體地,涉及客戶機/服務器拓撲結構集成測試),以使客戶端阻止等待服務器(或定位器)變得可用。在我的測試中,測試分叉了一個獨立的GemFire JVM進程來運行服務器,而測試VM充當緩存客戶端。

您可以通過將GemFire與春季會議,特別是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(..)方法這段時間。

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

理想的,但是,你開始什麼都在你的定位器,由於形成了集羣依賴於它。

希望這會有所幫助。

乾杯! John