我读到过使用Akka时的一个重要规则是避免任何阻塞的输入/输出操作、轮询、忙碌等待、睡眠等。但如果我真的需要一些流控制怎么办?
我使用Akka演员向我们的客户发送邮件,并且为了对邮件服务器友好,每5秒发送一封邮件。我的计划是使用dispatcher actor执行流程控制,使用发件人actor执行邮件发送工作。
class Dispatcher extends Actor {
def receive = {
case ResetPassword(to, data) =>
senderActor ! Mail("resetPassword", to, data)
Thread.sleep(5000)
...
}
}
class Sender extends Actor {
def receive = {
case Mail(to, data) => // send the mail immediately
...
}
}这条路对吗?如果不是,我应该如何进行流量控制?
发布于 2012-12-07 12:52:16
要做到这一点而不阻塞,一种方法是让另一个参与者随时持有发件箱状态。
class Outbox extends Actor {
var outbox: List[Mail] = Nil
def receive = {
case a: Mail => {
outbox = outbox :+ a
}
case MailToSend => {
val maybeMailToSend = outbox.headOption
outbox = outbox.tail
senderActor ! maybeMailToSend
}
}
}然后让Sender参与者成为每隔5秒轮询发件箱的scheduled actor。它向Outbox参与者发送一条ask MailToSend消息,如果响应是Some,则发送一封邮件。
它看起来像这样:
调度发件人执行元:
system.scheduler.scheduleOnce(5 seconds, senderActor, PollOutbox)发送者角色:
class Sender extends Actor {
def receive = {
case PollOutbox => {
maybeMailToSend = outboxActor ? MailToSend
...
}
}
}https://stackoverflow.com/questions/13756920
复制相似问题