我需要将一个密钥放入Hazelcast映射中,如果密钥已经存在于地图中,则会抛出错误。这必须以原子方式完成,因此首先测试密钥是否存在然后在单独的操作中进行测试将无法正常工作。
问题在于:判断putIfAbsent()实际放置任何内容的唯一方法是测试返回的对象是新对象还是现有对象。但Hazelcast并没有回归现有的;它返回它的一个克隆。因此,您无法if (old == new)
进行测试。你必须做if (old.equals(new))
。麻烦的是我的对象庞大而复杂,并且实现自定义.equals()方法并不容易。
当然,有更好的方法可以做到这一点。 Hazelcast有不同的方法来做一个原子putIfAbsent()吗?
编辑:
我遇到了与IMap.replace()类似的问题。为了提供旧值和新值,我必须克隆旧值,修改它,调用replace(),并确保我的值上有一个equals()方法来进行比较。必须有一个更好的方法。如果Hazelcast会以某种方式为我提供地图中对象的版本号或时间戳,那么我可以对版本号或时间戳进行比较和设置,而不是必须处理每个字段。一个复杂的对象。
答案 0 :(得分:0)
也许您可以尝试使用EntryProcessor。
map.executeOnKey(key,PutIfAbsentEntryProcessor(value))
你需要自己实现这个PutIfAbsentEntryProcessor并返回原始值的true(你可以访问EntryProcessor中的那个)是否为null。