一个超简单的akka actor例子
2016-07-29 11:32
337 查看
一个超简单的akka actor例子
抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法。 Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子。本文翻译、整理于他的两篇文章。
下面几行代码就实现了一个actor。
123456789101112131415161718 | import akka.actor.Actorimport akka.actor.ActorSystemimport akka.actor.Props class HelloActor extends Actor { def receive = { case "hello" => println("您好!") case _ => println("您是?") }} object Main extends App { val system = ActorSystem("HelloSystem") // 缺省的Actor构造函数 val helloActor = system.actorOf(Props[HelloActor], name = "helloactor") helloActor ! "hello" helloActor ! "喂"} |
第5行定义了一个Actor, 实现了receive方法, 如果接收到"hello",返回一个礼貌性的"您好", 如果接收到其它消息,返回"您是?"
第12行定义了一个main对象
我们需要一个ActorSystem,所以在第13行创建了一个
第15行创建了一个HellActor的实例,返回结果类型为ActorRef。 这里HelloActor我们调用默认的构造函数,你也可以调用特定的带参数的构造函数
第16,17行我们发送了两个消息给这个actor, actor应该能收到这两条消息并处理
!是一个简化发送消息的操作符,
ScalaActorRef为ActorRef定义的一个隐式方法。
123 | trait ScalaActorRef { ref: ActorRef ⇒ def !(message: Any)(implicit sender: ActorRef = null): Unit} |
build.sbt,内容如下:
12345 | name := "Hello Test #1" version := "1.0" scalaVersion := "2.11.4" libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.9" |
2.11.4,你可以调整为你机器上合适的版本,以及相应的akka的版本。
将上述actor的代码复制到此文件夹下的
HelloActor.scala文件中。
执行下面的命令:
1 | C:\akka>sbt run |
12345678910111213141516171819202122 | C:\akka>sbt run[info] Set current project to Hello Test #1 (in build file:/C:/akka/)[info] Updating {file:/C:/akka/}akka...[info] Resolving org.scala-lang#scala-library;2.11.4 ... [info] Resolving com.typesafe.akka#akka-actor_2.11;2.3.9 ... [info] Resolving org.scala-lang#scala-library;2.11.5 ... [info] Resolving com.typesafe#config;1.2.1 ... [info] Resolving org.scala-lang#scala-compiler;2.11.4 ... [info] Resolving org.scala-lang#scala-reflect;2.11.4 ... [info] Resolving org.scala-lang.modules#scala-xml_2.11;1.0.2 ... [info] Resolving org.scala-lang.modules#scala-parser-combinators_2.11;1.0.2 ... [info] Resolving jline#jline;2.12 ...[info] Done updating.[warn] Scala version was updated by one of library dependencies:[warn] * org.scala-lang:scala-library:2.11.4 -> 2.11.5[warn] To force scalaVersion, add the following:[warn] ivyScala := ivyScala.value map { _.copy(overrideScalaVersion = true) }[warn] Run 'evicted' to see detailed eviction warnings[info] Running Main您好!您是? |
Ctrl+
C可以终止程序的运行。
这里还有一个更复杂的例子,涉及到两个actor的交互。 就像两个人在乒乒乓乓的打乒乓球。 两个actor来回的ping pang,直到达到特定的次数才停止。
123456789101112131415161718192021222324252627282930313233343536373839404142434445 | import akka.actor._ case object PingMessagecase object PongMessagecase object StartMessagecase object StopMessage class Ping(pong: ActorRef) extends Actor { var count = 0 def incrementAndPrint { count += 1; println("ping") } def receive = { case StartMessage => incrementAndPrint pong ! PingMessage case PongMessage => if (count > 9) { sender ! StopMessage println("ping stopped") context.stop(self) } else { incrementAndPrint sender ! PingMessage } }} class Pong extends Actor { def receive = { case PingMessage => println(" pong") sender ! PongMessage case StopMessage => println("pong stopped") context.stop(self) context.system.shutdown() }} object PingPongTest extends App { val system = ActorSystem("PingPongSystem") val pong = system.actorOf(Props[Pong], name = "pong") val ping = system.actorOf(Props(new Ping(pong)), name = "ping") // start them going ping ! StartMessage} |
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
相关文章推荐
- Akka Actor: 从最简单的例子开始
- 今天的问题:一个简单的例子,请帮我解开“接口实现Java‘隐藏实现细目’”的迷惑。
- SYBASE ASE 12.0 上一个横表转纵表的简单例子
- [导入]一个简单的用JS调用WebService的例子
- 一个简单的tcp filter的例子
- 一个简单的例子说明Struts的工作流程
- 一个简单的以太网广播收发例子
- C++ Boost 之Python(一个简单的例子)
- 一个简单的用JS调用WebService的例子
- 一个简单的IoC例子(抄袭)
- 用PHP开发GUI(一个简单的例子)
- [Struts]学习日记1 - 一个简单的例子
- 一个简单的XML Schema的例子
- Struts 教程I:一个用jbuilder X 做的最简单的helloworld的struts例子
- 【转】一个用Visual C#做组件的简单例子
- 蛙蛙推荐: 用web服务传递Dataset的一个简单例子
- 一个在程序中实现plugin机制的简单例子
- 一个简单的Eclipse插件开发的例子——HelloWorld【转载】
- 软件开发中的矛盾——一个简单的例子
- Spring 入门(一个简单的例子)