More Actors
To illustrate using two actors in an Akka system, let's create a simple Scala application where one actor sends a message to another actor. This example demonstrates basic actor interaction, message passing, and how actors can work together to achieve a task.
We'll create a scenario with two actors: Sender and Receiver. The Sender actor will send a greeting message to the Receiver actor, which will then log the greeting.
Step 1: Define Messages
First, define the messages that actors will use for communication. For simplicity, we'll have a single message type that includes a string payload.
sealed trait Message
final case class Greet(message: String) extends Message
Step 2: Define the Receiver Actor
The Receiver actor will handle the Greet message by printing it to the console.
import akka.actor.typed.{ActorRef, Behavior}
import akka.actor.typed.scaladsl.Behaviors
object Receiver {
def apply(): Behavior[Message] = Behaviors.receive { (context, message) =>
message match {
case Greet(greeting) =>
context.log.info(s"Received message: $greeting")
Behaviors.same
}
}
}
Step 3: Define the Sender Actor
The Sender actor will send a Greet message to the Receiver. It needs a reference to the Receiver actor, which we'll pass as a constructor parameter.
object Sender {
def apply(receiver: ActorRef[Message]): Behavior[Message] = Behaviors.setup { context =>
// Sending the greeting message to the receiver
receiver ! Greet("Hello, Akka Typed Actors!")
Behaviors.same
}
}
Step 4: Set Up the Actor System
Now, set up the ActorSystem, create both actors, and start the interaction.
import akka.actor.typed.ActorSystem
object AkkaQuickStart extends App {
// Create the Actor System
val actorSystem: ActorSystem[Message] = ActorSystem(Receiver(), "receiverSystem")
// Create the Receiver Actor
val receiver: ActorRef[Message] = actorSystem.systemActorOf(Receiver(), "receiver")
// Create the Sender Actor and pass the Receiver's ActorRef
actorSystem.systemActorOf(Sender(receiver), "sender")
}
In this example, when the AkkaQuickStart application runs, it sets up an ActorSystem and creates both Sender and Receiver actors. The Sender immediately sends a Greet message to the Receiver upon initialization, demonstrating basic actor communication. The Receiver actor logs the message to the console as its way of "handling" the message.