Часы никогда не срабатывают в 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))
});
Другие вопросы по тегам