首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >手表从不在FoundationDB中触发

手表从不在FoundationDB中触发
EN

Stack Overflow用户
提问于 2018-11-21 15:32:19
回答 1查看 180关注 0票数 0

我玩手表的功能,并努力使它的工作。问题是,手表从不开火,它根本不对我在其他事务中为键所做的更改做出反应。

代码语言:javascript
复制
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

有谁知道为什么手表不像它应该做的那样对变化做出反应呢?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-11-26 22:40:02

我认为这里发生的是你的第一笔交易永远不会完成。从文档中可以看出这一点,但是在函数中返回的runAsync准备好之后,CompletableFuture才会返回。因为您正在返回手表未来,并且直到事务之后才更改值,所以它永远不会准备好,事务也永远不会结束。

如果您将runAsync替换为run,我认为它会起作用:

代码语言:javascript
复制
val watchExecuted = db.run(tr => {
  tr.set(key, new Tuple().add(1).pack())
  tr.watch(key)
})

如果您想使用runAsync,那么您需要返回包装在另一个对象中的手表未来。

编辑:或者说,如果您想使用runAsync,可以返回一个CompletableFuture<CompletableFuture<Void>>

代码语言:javascript
复制
var watchExecuted = db.runAsync(tr => {
  tr.set(key, new Tuple().add(1).pack())
  CompletableFuture.completedFuture(tr.watch(key))
});
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/53415446

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档