Часы никогда не срабатывают в FoundationDB - PullRequest
0 голосов
/ 21 ноября 2018

Я играл с функциональностью часов и изо всех сил пытался заставить это работать.Проблема в том, что часы никогда не срабатывают, они просто не реагируют на изменения, которые я делаю для ключа в других транзакциях.

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 голосов
/ 27 ноября 2018

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