akka中的actor间通信保证是本地FIFO.True或False

时间:2018-05-13 05:20:19

标签: akka

akka中的参与者间通信保证是本地FIFO。这个陈述是对还是错?我不确定答案。

1 个答案:

答案 0 :(得分:0)

这取决于您为演员选择的mailbox

默认情况下,在每个actor系统中,发送给一个actor的消息将根据您发送给actor的顺序逐个处理。

但如果您选择一些特殊邮箱,例如PriorityMailbox,事情发生了变化,步骤如下:

a)创建优先邮箱:

import akka.dispatch.PriorityGenerator
import akka.dispatch.UnboundedStablePriorityMailbox
import com.typesafe.config.Config

// We inherit, in this case, from UnboundedStablePriorityMailbox
// and seed it with the priority generator
class MyPrioMailbox(settings: ActorSystem.Settings, config: Config)
  extends UnboundedStablePriorityMailbox(
    // Create a new PriorityGenerator, lower prio means more important
    PriorityGenerator {
      // 'highpriority messages should be treated first if possible
      case 'highpriority => 0

      // 'lowpriority messages should be treated last if possible
      case 'lowpriority  => 2

      // PoisonPill when no other left
      case PoisonPill    => 3

      // We default to 1, which is in between high and low
      case otherwise     => 1
    }
)

b)将其添加到配置中:

prio-dispatcher {
  mailbox-type = "docs.dispatcher.DispatcherDocSpec$MyPrioMailbox"
  //Other dispatcher configuration goes here
}

c)然后是一个关于如何使用它的例子:

// We create a new Actor that just prints out what it processes
class Logger extends Actor {
  val log: LoggingAdapter = Logging(context.system, this)

  self ! 'lowpriority
  self ! 'lowpriority
  self ! 'highpriority
  self ! 'pigdog
  self ! 'pigdog2
  self ! 'pigdog3
  self ! 'highpriority
  self ! PoisonPill

  def receive = {
    case x => log.info(x.toString)
  }
}
val a = system.actorOf(Props(classOf[Logger], this).withDispatcher(
  "prio-dispatcher"))

您将看到如下日志,该消息现在不是先进先出。但是对于default mailbox,您的答案是肯定的。

/*
 * Logs:
 * 'highpriority
 * 'highpriority
 * 'pigdog
 * 'pigdog2
 * 'pigdog3
 * 'lowpriority
 * 'lowpriority
 */

您可以参考Akka document了解更多详情。