抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法。 Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子。
本文翻译、整理于他的两篇文章。
下面几行代码就实现了一个actor。
|
|
- 1到3行是引入必要的类
- 第5行定义了一个Actor, 实现了receive方法, 如果接收到"hello",返回一个礼貌性的"您好", 如果接收到其它消息,返回"您是?"
- 第12行定义了一个main对象
- 我们需要一个ActorSystem,所以在第13行创建了一个
- 第15行创建了一个HellActor的实例,返回结果类型为ActorRef。 这里HelloActor我们调用默认的构造函数,你也可以调用特定的带参数的构造函数
- 第16,17行我们发送了两个消息给这个actor, actor应该能收到这两条消息并处理
!
是一个简化发送消息的操作符, ScalaActorRef为ActorRef定义的一个隐式方法。
|
|
假定你已经安装了scala和sbt。创建一个文件夹,在此文件夹中新建一个build.sbt
,内容如下:
|
|
我机器上安装scala的版本为2.11.4
,你可以调整为你机器上合适的版本,以及相应的akka的版本。
将上述actor的代码复制到此文件夹下的HelloActor.scala
文件中。
执行下面的命令:
|
|
输出结果
|
|
Ctrl
+ C
可以终止程序的运行。
这里还有一个更复杂的例子,涉及到两个actor的交互。 就像两个人在乒乒乓乓的打乒乓球。 两个actor来回的ping pang,直到达到特定的次数才停止。
|
|
这里定义了两个actor: Ping和Pang。
- Ping 接收StartMessage和 PongMessage。 StartMessage是一个启动消息,由main对象发送,PongMessage来自Pong actor,如果次数还未达到,它继续发送PingMessage。
- Pong 接收StopMessage和 PingMessage。 如果接收到PingMessage,它就发送一个PongMessage, 如果是StopMessage, 停止ActorSystem
这里调用了Ping的带参数的构造函数 Props(new Ping(pong))
参考文档
- Simple Scala Akka Actor examples (Hello, world examples)
- A 'Ping Pong' Scala Akka actors example