如果value.status为'XXX',则仅更新区域中的值

问题描述 投票:0回答:1

我们正在努力在我们的工作中使用Gemfire。我们有一个区域,我们存储每个请求进入并经历其生命周期(例如,状态是A - > B - > C - > D)

但是我们还要求只有当前状态为B时才需要将状态更新为C(因为状态D正在通过其他进程更新Async)。我们曾经使用ONLY IF关键词在cassandra中实现它。在Gemfire中寻找类似的东西。显然我们不能做Read,Check State和Update,因为它不是原子的。

其他选择是通过采用分布式锁来执行此操作,然后执行上述检查更新。但是这个选项会带来性能开销。

我们还考虑附加CacheWriter并检查beforeUpdate(..)中的状态。但是我们知道我们作为beforeUpdate的参数获得的是值的副本而不是实际值。

有没有人知道如何以原子方式实现它我们可以尝试?

gemfire spring-data-gemfire
1个回答
0
投票

你要找的是这个,Region.replace(key, oldValue, newValue)。这是一个原子操作。

更新:我还应该澄清,目前无法检查映射对象值的某些属性(例如someObject.state = XYZ)以确定是否执行更新/替换。为此,您需要一个正确实施的Object.equals()方法。

© www.soinside.com 2019 - 2024. All rights reserved.