1

我们正在使用 Apache Ignite 进行缓存,在测试期间我遇到了这个错误

java.lang.IllegalStateException:缓存已关闭或销毁

我们有一个嵌入了 IGNITE 的 Spring Restful 客户端。调用来更新和从缓存中删除。

发生的步骤如下

  1. Ignite 服务器的一个实例正在运行。
  2. 一个在不同服务器上运行的带有 Ignite Embedded 的 Restful 客户端实例。
  3. 杀死了 Ignite 服务器实例,客户端仍在运行
  4. 点燃服务器重新启动。
  5. 客户端将值放入缓存的任何尝试都会导致上述异常。
  6. 如果客户端重新启动,一切正常

有人可以对为什么会发生这种情况提出一些见解。我是否必须处理所有节点离开并手动驱逐缓存或其他东西的事件。

需要任何帮助

4

2 回答 2

3

如果所有服务器都关闭,客户端会使用新 ID 重新加入(就像您手动重新启动它一样)。在这种情况下,所有现有的缓存实例都将关闭,您必须获取新的缓存实例(使用Ignite.cache(...)方法)。

有一张票可以改善这种行为:https ://issues.apache.org/jira/browse/IGNITE-2766

于 2016-03-04T22:39:04.200 回答
1

我们也遇到了这个问题,我们有一个解决方法。我们实现了我们自己版本的 SpringCacheManager (ReconnectSafeSpringCacheManager),它将缓存对象包装在重新连接安全缓存代理对象 (ReconnectSafeCacheProxy) 中。

当一个IllegalStateException缓存代理捕获到一个缓存代理时,我们告诉缓存管理器删除该缓存(从内部caches映射中删除它),然后我们调用ReconnectSafeSpringCacheManager.getCache(<cacheName>)which 重新创建 Ignite 缓存实例。代理将其缓存引用替换为新的 Ignite 缓存,然后重试导致异常的操作。

我们的方法要求我们将缓存管理器代码放在org.apache.ignite.cache.spring包中,因为 SpringCacheManager 中有对非公共 API:s 的引用,这不是最干净的方法,但它似乎有效,我们计划在IGNITE时删除解决方法-2786已解决。

于 2016-06-03T13:57:03.877 回答