0

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

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

有人知道为什么手表不会像它应该做的那样对变化做出反应吗?

4

1 回答 1

1

我认为这里发生的事情是您的第一笔交易永远不会完成。从文档中可能并不明显,但在您的函数中返回的准备就绪runAsync之前不会返回。CompletableFuture因为您要返回手表未来并且在交易之后才更改值,所以它永远不会准备好并且交易永远不会结束。

如果您替换runAsyncrun,我认为它会起作用:

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

如果你想使用runAsync,那么你需要将你的手表未来包裹在另一个对象中。

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

var watchExecuted = db.runAsync(tr => {
  tr.set(key, new Tuple().add(1).pack())
  CompletableFuture.completedFuture(tr.watch(key))
});
于 2018-11-26T22:40:02.797 回答