- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个角色“ItemProvider”,它可以接收“getItems”消息。ItemProvider 管理项目的 Items。因此,我可以有多个请求项目 A 项目的“getItems”消息和请求项目 B 项目的其他“getItems”消息。
第一次“itemProvider”收到这样的消息时,它需要调用服务来实际获取项目(这可能需要一分钟时间,服务会返回一个 future,这样它就不会阻止参与者)。在此等待期间,其他“getItems”消息可能会到达。
项目“ItemProvider”缓存它从服务接收的“Items”。因此,在 1 分钟加载时间后,它可以立即提供元素。
我非常确定“ItemProvider”应该使用 Akka 的成为功能。但它应该如何处理无法立即服务的客户呢?
我可以想到以下选项:
ItemProvider 持有一个待处理消息列表。它无法提供的消息将添加到此列表中。当 ItemProvider“准备好”时,它将处理待处理的客户端
ItemProvider 将消息发送回其父级。并且父级将重新发出消息
ItemProvider 使用调度程序。并在将来再次收到消息。
也许不使用become而是使用AbstractFSM类?
有人知道实现 ItemProvider 的最佳 Akka 方法吗?
最佳答案
看看 Akka 的 Stash feature (usage example)。下面是(未经测试的)代码,用于在从服务器请求实际项目时存储 getItems 消息,然后在服务器请求完成后处理所有 getItems 消息
import akka.actor.{Actor, Stash}
class ItemProviderActor extends Actor with Stash {
private[this] itemsOpt : Option[Items] = None
def receive = processing
def processing: Receive = {
case m:GetItems => {
if(itemsOpt.nonEmpty) {
// respond immediately
itemsOpt.foreach(sender() ! _)
}
else {
// Stash current request and initiate cache update
context.become(retrivingData)
stash()
// Will send future results of item retrieval as a message to self
retrieveItems().pipeTo(self)
}
}
}
def retrivingData: Receive = {
case m: Items =>
// items are retrieved, update cache
itemsOpt = Option(m)
// resume normal processing
context.become(processing)
// put all pending item requests back to actor's message queue
unstashAll()
case m:GetItems =>
// busy retrieving items, store request to serve later
stash()
}
def retrieveItems() : Future[Items] = {
???
}
}
关于java - 推迟消息的最佳方式是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26670318/
我想以与 Angular 的 defer.resolve 和 Javascript Promise 对象相同的方式解析一个 Promise 对象。换句话说:我想创建一个要返回的虚拟 promise 对
我有两个实时制作和更新的图,如下所示: 我使用标准函数 plot() 和 lines() 生成了这些图。由于我实时生成和重新生成这些图,因此需要进行大量重绘和闪烁操作。 是否可以在两个图都完成之前推迟
我的一个页面上有一些 js 代码,它使用 ajax 加载一些页面元素。这些发生在页面的最顶部,不幸的是减慢了页面其余部分的加载速度。我想知道是否有办法推迟此操作,以便它在页面加载后加载。 这是我正在使
我有以下场景。 CompletableFuture result = CompletableFuture.supplyAsync(task, executor); result.thenRun(()
我经常更新用户表,它只是设置用户的最后一次上线时间,我想知道是否有一种简单的方法可以延迟它们并将它们在短超时(5 分钟或所以)。这将大大减少对我的用户数据库的查询。 最佳答案 如果您执行UPDATE
Gtmetrix 说有一些来自 youtube 的 JS 文件需要推迟。我删除了 iframe 并使用 jQuery 和经典的 Javascript 代码推迟了它,但这两种方法都不起作用。 Gtmet
我正在寻找阻止切换 RadioButton 的可能性,但仍然捕获 Click 事件。不幸的是,使用 Enabled=false 或 IsHitTestVisible=false 属性会阻止 Click
在我的小应用程序中,我从系统(不受我控制)收到一系列排队的 onEventXXX()。 不能保证那些 onEventXXX() 的时间。唯一可以保证的是,它们会按照放入队列的顺序接收。 在 onEve
我有一个在多个 View Controller 中使用 UIWebViews 的应用程序。 UIWebViews 用于渲染本地生成的 html,无需缓慢的网络访问。 为了节省内存,我仅根据 viewc
有时我想推迟 Promise 构造函数的执行,但仍然能够定义 Promise 链。我发现并稍微调整了以下方法,但由于我对 promise 的经验很少,所以我想知道 是否有更简洁的方法来做到这一点? 这
我刚刚遇到了使用 jQuery 的 .delay() 方法(v 1.4.2)尝试延迟以下 .load() 方法的问题。 像这样: $('myElement').delay(500).load('myP
我定义了一个成员变量如下。由于变量不会传递,所以我决定在这里使用 scoped_ptr 而不是 shared_ptr。 class ClassName { public: ClassName(
在开发我的作品集时,我意识到页面加载需要很长时间,因为必须加载所有图像才能完成页面加载。 所以,我想知道是否有办法阻止或停止加载,然后再允许加载。 意思是,立即阻止加载,然后单击已加载的另一个元素,比
这个问题已经有答案了: Defer loading and parsing of PrimeFaces JavaScript files (2 个回答) 已关闭 8 年前。 Google pagesp
我正在尝试推迟或异步加载 Trip Advisor 小部件,但由于某种原因它不起作用。 我认为异步或延迟可能不起作用,因为 Trip Advisor 脚本随后执行 document.write 命令。
我正在尝试使用 Ajax 将一些内容加载到页面中。加载的 html 包含一些 JavaScript 代码。即使代码包装在 $(document).ready 中,它也会在内容插入文档之前执行,因为在加
我正在使用模板字符串来生成一些文件,我喜欢新的 f 字符串的简洁性,用于减少我以前的模板代码,如下所示: template_a = "The current name is {name}" names
我有一个处理多个客户端连接的 Android 绑定(bind)服务。如果我理解正确的话,如果没有客户端连接,Android 将终止该服务。 但是,此时,在客户端断开连接后 1 分钟内,我的服务可能仍有
我的以下目标是: 获取决议列表 (按顺序)扫描每个内容,找到第一个导致成功直播的内容 为了测试这一点,我有 testVideoPresence: var testCounter = 0; functi
现在,我让用户在注册页面上输入数据,其中包括让用户输入他们的“计划类型”。我将此用户数据存储在 Firebase 上。 在用户提交上一个输入页面后的下一页上,我将用户带到一个输出页面,该页面使用 An
我是一名优秀的程序员,十分优秀!