仅当 value.status 为 'XXX' 时更新区域中的值

Update the value in region ONLY IF value.status is 'XXX'

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

但我们也有一个要求,即只有当当前状态为 B 时,我们才需要将状态更新为 C(因为状态 D 正在通过其他进程异步更新)。我们曾经通过使用 ONLY IF 关键字在 cassandra 中实现它。在 Gemfire 中寻找类似的东西。显然我们不能读取、检查状态和更新,因为它不是原子的。

其他选择是通过获取分布式锁然后执行上面提到的检查更新来做到这一点。但是此选项会带来性能开销。

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

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

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

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