Часы никогда не срабатывают в 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 ответ
Я думаю, что здесь происходит то, что ваша первая транзакция никогда не завершается. Это может быть не очевидно из документации, но 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))
});