我想有可能让演员睡一会儿。演员们应该自己决定他们要睡多久。由于thread.sleep()不是一种推荐的方法,所以我想到在Akka中使用调度程序。因此,我定义一个actor是指另一个actor可以注册被唤醒。
class Scheduler extends Actor {
def receive = {
case Sleep(duration) => context.system.scheduler.scheduleOnce(duration) {
sender ! Ring
}
}
}
但发送方从未接收到振铃消息。所以我的问题是
让我首先回答标题问题:是的,在一个actor内部使用调度程序是可能的。
case Sleep(duration) =>
context.system.scheduler.scheduleOnce(duration, self, Ring)
你没有说出你真正想要达到的目标,所以我在这里做了一个有根据的猜测,你希望演员--它通常会做一些叫“X”的事情--做一些叫“Y”的事情,暂时中止“X”activity。这一问题的全部解决办法是
class Sleepy extends Actor {
def receive = {
... // cases doing “X”
case Sleep(duration) =>
case object WakeUp
context.system.scheduler.scheduleOnce(duration, self, WakeUp)
context.become({
case WakeUp => context.unbecome()
// drop the rest
}, discardOld = false)
}
}
同样也可以使用FSM特性并在正常和休眠状态之间切换来实现。当然,您可以在睡眠时做任何您想做的事情,例如,在Akka 2.1中混合stash
特性,并在睡眠时为所有(或部分)消息调用stash()
,在获得wakeup
消息时调用unstashall()
;或者你可以做点别的什么。演员很灵活。
演员从不真正睡觉,他们总是处理传入的消息。如上所示,您可以定义这意味着什么,但基本原则是,您不能挂起一个执行元,这样它就不会处理其邮箱中的消息。
由于akka是一个构建actor模型的工具包,而actor模型是运行在JVM内部的对象,那么创建后的actor对象的可靠性有多高。考虑到让它崩溃的性质,除非像使用毒丸或JVM关闭一样显式地杀死它,否则JVM中actor对象的可靠性有多高,actor不是自己全部杀死的。
Akka的文件警告: 在actor内部使用未来的回调时,如onComplete、onSuccess和onFailure,您需要小心避免关闭包含actor的引用,即不要从回调中调用方法或访问封闭actor上的可变状态 在我看来,如果我能让想要访问可变状态的未来在同一调度程序上运行,该调度程序安排了处理actor消息的线程的相互排除,那么这个问题就可以避免。这可能吗?(为什么不呢? 提供的没有绑定到参
我正在使用Scala/Akka编写一个TCP客户端服务器程序。服务器端的一些参与者需要处理来自客户端的TCP消息。我使用了(复制)代码,基本上解析接收到的TCP消息,在接收到分隔符时,消息被发送给其他人。 由于不止一个actor使用此逻辑,所以我在baseTCP actor中对其进行了抽象,并从该actor继承了其他actor。我想在这个基本actor中添加一些常见的代码,比如处理bound/co
我很想知道调整大小,或者在本例中增加单个节点系统上的actor池中actor的数量是否真的会影响性能。 我有一个带超线程的四核系统。在任何给定的点上,系统可以运行8个线程。假设执行元执行的大多数操作都是CPU绑定的,那么将池中的执行元数量从20个增加到40个会有什么收获呢?
我经常发现自己使用一个“主”角色,为子任务创建许多子角色。当子任务完成时,主角也应该停止自己。所以当时,我观察子角色并停止主角色context.children.is。 我经常使用这种模式,但因为我从未读过这方面的文章。我不确定,这是一个好主意还是失败的演员有问题。。。? 我已经读过Akka 2中的关机模式,但是这种方法在Java中似乎比我的解决方案更复杂? 以下是我针对具有两个子任务的主要参与者
在Play 2.2中,我创建了GlobalActor制作类 我想将游戏框架升级到 2.5。Play.current在play 2.5中被弃用,所以我使用注入器修改了这个类,但注入器始终为Null。我需要如何使这门课在 Play 2.5 中工作?