手表永远不会在 FoundationDB 中触发

Watches never trigger in FoundationDB

我在玩手表的功能并努力让它工作。 问题是手表永远不会触发,它根本不会对我在其他交易中对密钥所做的更改做出反应。

val key = new Tuple().add("watch-test").pack()
val watchExecuted = db.runAsync(tr => {
  tr.set(key, new Tuple().add(1).pack())
  tr.watch(key)
})

Thread.sleep(5000) // ensure that watch applied

db.run(tr => {
  tr.set(key, new Tuple().add(2).pack())
})

watchExecuted.get() // never finish

有没有人知道为什么手表不会像预期的那样对变化做出反应?

我认为这是因为您的第一笔交易从未完成。从文档中可能并不明显,但是 runAsync 不会 return 直到函数中的 CompletableFuture returned 准备就绪。因为您正在 return 手表期货并且在交易之后才更改价值,所以它永远不会准备好并且交易永远不会结束。

如果您将 runAsync 替换为 run,我认为它会起作用:

val watchExecuted = db.run(tr => {
  tr.set(key, new Tuple().add(1).pack())
  tr.watch(key)
})

如果您想使用 runAsync,那么您需要 return 您的手表未来包裹在另一个物体中。

编辑:或者更确切地说,如果你想使用 runAsync,你可以 return a CompletableFuture<CompletableFuture<Void>>:

var watchExecuted = db.runAsync(tr => {
  tr.set(key, new Tuple().add(1).pack())
  CompletableFuture.completedFuture(tr.watch(key))
});