抛开复杂的业务逻辑,让我们从一个超级简单的例子学习Akka Actor的用法。 Scala cookbook的作者Alvin Alexander在他的网站上提供了两个例子。
本文翻译、整理于他的两篇文章。

下面几行代码就实现了一个actor。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
import akka.actor.Actor
import akka.actor.ActorSystem
import 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 ! "喂"
}
  • 1到3行是引入必要的类
  • 第5行定义了一个Actor, 实现了receive方法, 如果接收到"hello",返回一个礼貌性的"您好", 如果接收到其它消息,返回"您是?"
  • 第12行定义了一个main对象
  • 我们需要一个ActorSystem,所以在第13行创建了一个
  • 第15行创建了一个HellActor的实例,返回结果类型为ActorRef。 这里HelloActor我们调用默认的构造函数,你也可以调用特定的带参数的构造函数
  • 第16,17行我们发送了两个消息给这个actor, actor应该能收到这两条消息并处理

!是一个简化发送消息的操作符, ScalaActorRef为ActorRef定义的一个隐式方法。

1
2
3
trait ScalaActorRef { ref: ActorRef ⇒
def !(message: Any)(implicit sender: ActorRef = null): Unit
}

假定你已经安装了scala和sbt。创建一个文件夹,在此文件夹中新建一个build.sbt,内容如下:

1
2
3
4
5
name := "Hello Test #1"
version := "1.0"
scalaVersion := "2.11.4"
libraryDependencies += "com.typesafe.akka" %% "akka-actor" % "2.3.9"

我机器上安装scala的版本为2.11.4,你可以调整为你机器上合适的版本,以及相应的akka的版本。
将上述actor的代码复制到此文件夹下的HelloActor.scala文件中。

执行下面的命令:

1
C:\akka>sbt run

输出结果

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
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,直到达到特定的次数才停止。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
import akka.actor._
case object PingMessage
case object PongMessage
case object StartMessage
case 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
}

这里定义了两个actor: Ping和Pang。

  • Ping 接收StartMessage和 PongMessage。 StartMessage是一个启动消息,由main对象发送,PongMessage来自Pong actor,如果次数还未达到,它继续发送PingMessage。
  • Pong 接收StopMessage和 PingMessage。 如果接收到PingMessage,它就发送一个PongMessage, 如果是StopMessage, 停止ActorSystem

这里调用了Ping的带参数的构造函数 Props(new Ping(pong))

scala中akka actor例子相关推荐

  1. akka actor java_Akka:使用非默认构造函数在Scala中定义一个actor并从Java代码创建它 - java...

    Akka Scala演员必须扩展akka.actor.Actor Akka Java actor必须扩展akka.actor.UntypedActor 因此,在使用非默认构造函数定义Scala act ...

  2. Scala系列-5、scala中的泛型、actor、akka

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 传送门:大数据系列文章目录 目录 scala的 泛型 给方法定义泛型 给类定义泛型 泛型的上下 ...

  3. Akka 系列(五):Java 和 Scala 中的 Future

    随着CPU的核数的增加,异步编程模型在并发领域中的得到了越来越多的应用,由于Scala是一门函数式语言,天然的支持异步编程模型,今天主要来看一下Java和Scala中的Futrue,带你走入异步编程的 ...

  4. Akka之在IoT系统中使用Actor(一)

    (一)IoT系统介绍 通过了解Actor的层次结构和行为,剩下的问题是如何将IoT系统的顶层组件映射到actor.将代表设备和仪表板的Actor放在顶层可能很诱人.相反,我们建议创建一个代表整个应用程 ...

  5. Scala中的Map使用例子

    Map结构是一种非常常见的结构,在各种程序语言都有对应的api,由于Spark的底层语言是Scala,所以有必要来了解下Scala中的Map使用方法. (1)不可变Map 特点: api不太丰富 如果 ...

  6. flink中akka的使用 以jobClient提交任务为例子

    在flink中,集群内部的组件之间通过akka来互相通信,其中采用了akka中的actor模型. 当需要提交一个可用的任务交由jobManager来处理并分配资源时,将会在ClusterClinet中 ...

  7. 用一个例子告诉你 什么是Scala中的List

    1. List是什么? List是Scala中 表示有序集合的不可变链表的实现类   scala.collection.immutable.List 并且提供了两个List子类       case ...

  8. 在.NET中实现Actor模型的不同方式

    上周,<实现领域驱动设计>(Implementing Domain-Driven Design)一书的作者Vaughn Vernon,发布了Dotsero,这是一个使用C#编写的.基于.N ...

  9. Scala基于Akka模拟Spark Master Worker进程间通信(二):Worker定时向Master心跳

    最终效果 Master package cn.zxl.spark.masterimport akka.actor.{Actor, ActorRef, ActorSystem, Props} impor ...

最新文章

  1. “计算机艺术之父”、现代计算机技术先驱查理斯·苏黎去世,享年99岁!
  2. 皮一皮:经历过的举手报道...
  3. 吐血整理!10 个机器学习教程汇总,爱可可推荐!
  4. linux python安装第三方库_Linux中安装python3.6和第三方库
  5. 使命召唤16正在获取cdn地址_玩机不求人 | 简单教程,爽玩《使命召唤:战区》攻略!...
  6. LoadRunner函数
  7. ios realm 文件_iOS Realm数据库使用
  8. 不同存储结构的文件磁盘io操作次数_MySQL InnoDB存储引擎
  9. IDC:安全性、价格和低复杂性是企业采用SD-WAN的主要动因
  10. 用java有理数类包含加减乘除_用java具体代码实现分数(即有理数)四则运算
  11. C++之导入lib库
  12. jQuery实现点击行(tr)选中某列中CheckBox
  13. JDK1.8中文帮助文档下载
  14. 计算机科学丛书(2014-2018.Q1)
  15. vs2005 应用程序正常初始化失败的解决方案
  16. 光敏二极管的工作原理
  17. java发送lrc文件格式_基于java的lrc歌词文件解析工具
  18. 通过 Docker 化一个博客网站来开启我们的 Docker 之旅
  19. 八位硕博大佬的百度之旅~
  20. Android插件化:从入门到放弃

热门文章

  1. 26行代码AC_试题 历届试题 日期问题 | 第八届蓝桥杯B组第七题
  2. 如何获得所有CSDN勋章的获取方式?
  3. 基因表达式编程gep_基因表达式编程GEP— 前言
  4. Java Math的 floor,round和ceil的总结 ,java基础知识
  5. JSP关于用户安全退出的问题
  6. vba quit此文件正由另一个应用程序或用户使用_VBA|如何添加外部对象库(或控件)引用来扩展VBA功能...
  7. 崩坏三x86架构闪退_不给X86留活路?苹果下一代M系列芯片竟然这么强
  8. python测验7编程题_2020大学moocPython编程基础章节测验答案
  9. myeclipse写简单bbs代码_RabbitMQ实现即时通讯居然如此简单!连后端代码都省得写了?...
  10. java的八种数据类型_JAVA 的8种基本数据类型