仅当值为"XXX"时,才更新区域中的值



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

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

另一种选择是通过获取分布式锁来执行此操作,然后如上所述执行检查更新。但此选项会带来性能开销。

我们还在考虑附加一个 CacheWriter 并在 beforeUpdate(..( 中检查状态。但是知道我们在 beforeUpdate 之前作为参数得到的是值的副本,而不是实际值。

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

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

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

最新更新