如何防止hazelcast MapStore放入IMAP旧版本的Objects?

时间:2016-08-12 08:01:19

标签: hazelcast hazelcast-imap

如果您的群集成员包含一个对象的旧版本(旧库,未更新的对象等等。),您可能会有一个IMAP重复条目(从一个角度来看)模型对象)由于库的管理不正确......

如果您没有IMAP,例如IMAP<MyKey, MyValue>,则可能会混合 MyKey MyValue 的不同版本......

  1. 当您对旧版本的对象进行GET时,您会得到一个 HazelcastSerializationException:java.io.InvalidClassException
  2. 当你做PUT时你不会有任何例外吗?.... :(
  3. 有什么方法可以控制它?

    谢谢你!

1 个答案:

答案 0 :(得分:3)

这实际上取决于您如何序列化对象。

  • 如果您依赖于默认的java序列化(MyKeyMyValue实现Serializable),那么您需要使用static final long serialVersionUID并在每次修改时更新它该课程。

  • 如果您正在使用自定义序列化(例如实现com.hazelcast.nio.serialization.StreamSerializer),那么您需要检测读取和写入时的格式更改并采取相应措施。

注意:如果您需要更具体的答案,请提供您的课程代码(MyKeyMyValue),相关地图的hazelcast conf以及您的序列化技巧。

编辑(评论后):

我假设您使用地图的默认in-memory-format,即BINARY。在这种情况下,hazelcast将地图的项目存储为字节而不对其进行反序列化,因此put()上没有例外。但是,当你get()值时,hazelcast必须反序列化它,这就是你得到异常的时候。

另一方面,如果您将in-memory-format设置为OBJECT,则会强制使用hazelcast对put()上的对象进行反序列化,然后您将获得例外。

<强> EDIT2:

还有另一种方法可以在put()上激发异常,而无需更改in-memory-format。您可以在地图上添加EntryAddedListener

hz.getMap(Client.MAP_NAME).addEntryListener(new EntryAddedListener() {       
    public void entryAdded(EntryEvent event) {
        // this will deserialize the new value and throw exception if format doesn't match
        event.getValue(); 
    }
}, true);