监视永远不会在FoundationDB中触发

时间:2018-11-21 15:32:19

标签: 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

有人知道为什么手表对预期的变化没有反应吗?

1 个答案:

答案 0 :(得分:1)

我认为这是您的第一笔交易从未完成。从文档中可能看不出来,但是在函数中返回的runAsync准备好之前,CompletableFuture不会返回。因为您要退还手表的未来并且直到交易之后才更改价格,所以它永远不会准备就绪,交易也不会结束。

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

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))
});