There are some situations when you want your actor to process a certain message first before any other message, at any point of time. This means that you can tell an actor to do some particular work before doing any other job.
Creating a control-aware mailbox for an actor
Getting ready
To step through this recipe, we need to import our Hello-Akka project in IDE-like IntelliJ Idea. Prerequisites are the same as those of the previous recipes.
How to do it...
- Create a file, ControlAwareMailbox.scala, in package com.packt.chapter1.
- Add the following imports to the top of the file:
import akka.dispatch.ControlMessage
import akka.actor.{Props, Actor, ActorSystem}
- Create a control message case object as follows:
case object MyControlMessage extends ControlMessage
- Define an actor:
class Logger extends Actor {
def receive = {
case MyControlMessage => println("Oh, I have to process
Control message first")
case x => println(x.toString)
}
}
- Add the following configuration to application.conf:
control-aware-dispatcher {
mailbox-type =
"akka.dispatch.UnboundedControlAwareMailbox"
//Other dispatcher configuration goes here
}
- Create a test application in which we can send a message to the preceding application, and it will process the control message first:
object ControlAwareMailbox extends App {
val actorSystem = ActorSystem("HelloAkka")
val actor =
actorSystem.actorOf(Props[Logger].withDispatcher(
"control-aware-dispatcher"))
actor ! "hello"
actor ! "how are"
actor ! "you?"
actor ! MyControlMessage
}
- Run the application in IDE or from the console. You will get the following output:
Oh, I have to process Control message first
hello
how are
you?
How it works...
In step three, we create an object, MyControlMessage, which extends the ControlMessage.
ControlMessage is a trait. The message which extends this trait will be handled on priority by ControlAwareMailbox. ControlAwareMailbox maintains two queues to allow messages that extend ControlMessage to be delivered with priority.
In step four, we create an actor which will handle ControlMessage.
In step five, we configure the control-aware-dispatcher in application.conf.
In step six. we create the actor with control-aware-dispatcher.
In step seven, we are able to see in the output that the actor processed ControlMessage first.