手表永远不会在 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))
});
我在玩手表的功能并努力让它工作。 问题是手表永远不会触发,它根本不会对我在其他交易中对密钥所做的更改做出反应。
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))
});