我一直在使用手表的功能,并努力使其工作。 问题是手表永远不会触发,它根本不会对我为其他事务中的密钥所做的更改做出反应。
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
有人知道为什么手表对预期的变化没有反应吗?
答案 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))
});