2016-03-04 216 views
1

我們使用的是Apache點燃緩存和測試過程中我就翻過這個錯誤IGNITE高速緩存錯誤

java.lang.IllegalStateException:緩存已關閉或銷燬

我們有一個Spring RESTful客戶端嵌入式IGNITE內。調用來更新並從緩存中刪除。

所發生的步驟如下Ignite服務器運行

  1. 一個實例。
  2. Restful客戶端在不同服務器上運行的一個實例 Ignite Embedded。
  3. 終止Ignite服務器實例,客戶端仍在運行
  4. Ignite服務器重新啓動。
  5. 客戶端將任何值放入緩存中的嘗試都會導致超出 例外。
  6. 如果客戶端重新啓動一切工作正常

有一個人扔一些見解,如爲什麼發生這種情況。我必須處理所有節點的事件,並手動驅逐緩存或其他東西。

任何幫助appeciated

回答

3

如果所有服務器發生故障,客戶端重新加入一個新的ID(只是如果手動重新啓動等)。在這種情況下,所有現有的緩存實例都將關閉,您必須獲取新的緩存實例(使用Ignite.cache(...)方法)。

還有就是要改善這種行爲一票:https://issues.apache.org/jira/browse/IGNITE-2766

+0

Can not ignite.getOrCreateCache(cfg);在這裏幫助 – Mudassar

+0

Yha我正在嘗試使用上面的方法,但使用的是與服務器關閉前使用的緩存名稱相同的緩存名稱。我在客戶端使用了一個春季緩存。在客戶端引發這個問題是否是一個陳舊的例子?有什麼方法可以解決它,而無需重新啓動客戶端? –

+1

如果是Spring緩存,除了重新啓動客戶端之外,沒有解決方法。這將在下一個版本中解決:https://issues.apache.org/jira/browse/IGNITE-2765 –

1

我們也遇到了這個問題,我們有一個變通。我們實現了自己版本的SpringCacheManager(ReconnectSafeSpringCacheManager),它將緩存對象包裝在可重連接安全的緩存代理對象(ReconnectSafeCacheProxy)中。

IllegalStateException由高速緩存代理的一個抓住了,我們告訴我們的緩存管理命令來刪除緩存(從內部caches地圖上移除),然後我們稱之爲ReconnectSafeSpringCacheManager.getCache(<cacheName>)它再現了點燃緩存實例。代理將其緩存引用替換爲新的Ignite緩存,然後重試導致該異常的操作。

我們的方法要求我們將緩存管理器代碼放在org.apache.ignite.cache.spring包中,因爲在SpringCacheManager中引用了非公共API:s,這不是最簡潔的方法,但似乎可行,我們計劃刪除當解決IGNITE-2786時解決。