1. What is an Actor?
The Actor Model represents objects and their interactions, resembling
human organizations and built upon the laws of physics.
is an object with identity
has a behavior
only interacts using asynchronous message passing
2. The Actor Trait
type Receive = PartialFunction[Any, Unit]
trait Actor {
def receive: Receive
...
}
The Actor type describes the behavior of an Actor, its response to
messages.
3.A Simple Actor
class Counter extends Actor {
var count = 0
def receive = {
case ”incr” => count += 1
}
}
This object does not exhibit stateful behavior 不展示任何状态的actor
4. Making it Stateful 让它有状态
Actors can send messages to addresses (ActorRef) they know(Actor可以给它知道的Actor发消息):
class Counter extends Actor {
var count = 0
def receive = {
case ”incr” => count += 1
case (”get”, customer: ActorRef) => customer ! count
}
}
5.
How Messages are Sent
trait Actor {
implicit val self: ActorRef
def sender: ActorRef
...
}
abstract class ActorRef {
def !(msg: Any)(implicit sender: ActorRef = Actor.noSender): Unit
def tell(msg: Any, sender: ActorRef) = this.!(msg)(sender)
...
}
Sending a message from one actor to the other picks up the sender’s
address implicitly。 sender的地址会自动传递给receiver
6. 使用sender方法发message
Using the Sender
class Counter extends Actor {
var count = 0
def receive = {
case ”incr” => count += 1
case ”get” => sender ! count
}
}
7. Actor上下文定义了become和unbecome方法,可以改变actor的行为
The Actor’s Context
The Actor type describes the behavior, the execution is done by its
ActorContext.
trait ActorContext {
def become(behavior: Receive, discardOld: Boolean = true): Unit
def unbecome(): Unit
...
}
trait Actor {
implicit val context: ActorContext
...
}
8.改变Actor的行为
Changing an Actor’s Behavior
class Counter extends Actor {
def counter(n: Int): Receive = {
case ”incr” => context.become(counter(n + 1))
case ”get” => sender ! n
}
def receive = counter(0)
}
9.使用context 的 actorOf方法创建actor和storp方法停止Actor
Creating and Stopping Actors
trait ActorContext {
def actorOf(p: Props, name: String): ActorRef
def stop(a: ActorRef): Unit
...
}
Actors are created by actors.
“stop” is often applied to “self”.
10. 完整示例
package week5 import akka.actor.Actor import akka.actor.Props class CounterMain extends Actor { val counter = context.actorOf(Props[Counter], "counter") counter ! "incr" counter ! "incr" counter ! "get" def receive = { case count: Int => println(s"count was $count") context.stop(self) } }
package week5 import akka.actor.Actor class Counter extends Actor { var count = 0 def receive = { case "incr" => count += 1 case "get" => sender ! count } }
Props[Counter] ----- Counter为我们下面定义的Actor类
counter ---- 为这个新的Actor的名字
11. Actor在收到消息之后,可以做下面这些事
Upon reception of a message the actor can do any combination of the
following:
send messages 发消息
create actors 创建Actor
designate the behavior for the next message 设计收到下一条消息后的行为逻辑