文档章节

Akka入门实例

s
 sandyfog
发布于 2015/01/21 11:33
字数 993
阅读 39
收藏 0

Akka 是一个用 Scala 编写的库,用于简化编写容错的、高可伸缩性的 Java 和 Scala 的 Actor 模型应用。

Actor模型并非什么新鲜事物,它由Carl Hewitt于上世纪70年代早期提出,目的是为了解决分布式编程中一系列的编程问题。其特点如下:

  • 系统中的所有事物都可以扮演一个Actor
  • Actor之间完全独立
  • 在收到消息时Actor所采取的所有动作都是并行的,在一个方法中的动作没有明确的顺序
  • Actor由标识和当前行为描述
  • Actor可能被分成原始(primitive)和非原始(non primitive)类别
  • 非原始Actor有
    • 由一个邮件地址表示的标识
    • 当前行为由一组知识(acquaintances)(实例变量或本地状态)和定义Actor在收到消息时将采取的动作组成
  • 消息传递是非阻塞和异步的,其机制是邮件队列(mail-queue)
  • 所有消息发送都是并行的

首先通过一个简单的例子快速简单的介绍AKKA actor 是如何实现和使用的。

创建简单的 Actor 模式应用程序,定义EchoServer如下代码所示,EchoServer类继承 AKKA 中的 Actor 类,定义偏函数(Partial Function)receive,receive 函数中通过模式匹配(Pattern Match)实现程序逻辑。

 

 1 package foo
 2 
 3 import akka.actor.{ Actor, ActorSystem, Props}
 4 import akka.event.Logging
 5 
 6 object test extends App {
 7     
 8 val system = ActorSystem()
 9 
10 class EchoServer extends Actor {
11   val log = Logging(context.system,this)
12   def receive = {
13      case msg: String => println("echo " + msg)
14   }
15 }
16 
17 val echoServer = system.actorOf(Props[EchoServer])
18 echoServer ! "hello!"

如上代码所示,通过 AKKA 中的 ActorSystem 对象的 actorOf 方法创建上面的 EchoServer类对象实例,返回AKKA 中的 ActorRef 类型的 EchoServer对象, echoServer对象是 EchoServer类对象实例的引用,通过 echoServer对象可以向 EchoServer类对象实例发送消息。

注意: 

  •  如果 receive 方函数中不存在默认匹配,则会向 ActorSystem 的事件消息流(Event Stream)发送akka.actor.UnhandledMessage(message,sender,recipient)消息。 
  •  ActorRef 类型的对象是不可变的和可序列化的,可以在网络中进行传输,作为远程对象使用,具体的操作还是在本地的 Actor 类对象。
  •  Actor 对象的名称可以在创建时省略;如果不省略 actor 对象的名称,那么在同一个父 actor 对象下子actor 的名称必须唯一。 
  • Actor 对象的名称不能为空,并且不能是以‘$’开头的字符串。

创建带参数构造器 Actor 

 

 1 package foo
 2 
 3 import akka.actor.{ Actor, ActorSystem, Props}
 4 import akka.event.Logging
 5 
 6 object test extends App {
 7     
 8 val system = ActorSystem()
 9 
10 class Actor2(name:String) extends Actor {
11   val log = Logging(context.system,this)
12   def receive = {
13     case "hello" => log.info(name + " echo hello " )
14     case _ => log.info(name + " unknown msg")
15   }
16 }
17 val actor2 = system.actorOf(Props(new Actor2("tom")))
18 
19 actor2 ! "hello"

如上面代码所示,Actor2 类带有参数的构造函数,这种情况下无法使用Props[Actor2]的方式创建 actor2 对象。可以采用 call-by-name块(参考scala相关内容)的方式创建 actor2 对象

注意: 

  • Props(...)中不能始终传入同一个 actor 对象,例如 val lazy 或 object extends Actor 等单例工厂实现方式,这会和 AKKA 中 actor restart 机制冲突。 
  •  构造器参数不能是可变的(var),因为 call-by-name 块可能被其它线程调用,引起条件竞争。

Actor API
Actor trait 只定义了一个抽象方法,就是上面提到的 receive, 用来实现actor的行为。

如果当前 actor 的行为与收到的消息不匹配,则会调用 unhandled, 它的缺省实现是向actor系统的事件流中发布一条 akka.actor.UnhandledMessage(message, sender, recipient)。

另外,它还包括:

  • self 代表本actor的 ActorRef
  • sender 代表最近收到的消息的发送actor,通常用于下面将讲到的 回应消息中
  • supervisorStrategy 用户可重写它来定义对子actor的监管策略
  • context 暴露actor和当前消息的上下文信息

本文转载自:http://www.cnblogs.com/sandyfog/p/3714228.html

上一篇: log4j学习总结
s

sandyfog

粉丝 1
博文 6
码字总数 0
作品 1
徐汇
私信 提问
Scala 技术周刊 | 第 22 期

这里有最新的 Scala 社区动态、技术博文。 微信搜索 「scalacool」关注我们,及时获取最新资讯。 深度阅读 Status of the Collections Scala 集合重构进展 Akka 系列(十):Akka 集群之 Ak...

ScalaCool
2017/09/22
0
0
快速入门 Akka Java 指南

快速入门 Akka Java 指南 Akka 是一个用于在 JVM 上构建高并发、分布式和容错的事件驱动应用程序的运行时工具包。Akka 既可以用于 Java,也可以用于 Scala。本指南通过描述 Java 版本的示例来...

维C果糖
01/13
0
0
akka入门学习指引

对我而言,对akka的了解是学习scala的过程中书籍中的Akka章节推动的,当时书中介绍说。莫明地对它挺感兴趣的,就尝试着学习一下,我是先看完了数据中的Akka章节,里面主讲了Actor模型,包含了...

high_m
2017/10/26
0
0
跪求详细的关于akka 里面的 actor的入门指导

最近听说akka里面的actor在高并发上面的性能非常出色 在网上搜了半天,资料甚少。找不到能够好的介绍和实例。 后来又发现了jactor,资料还是非常少。看看大家有没有对这个比较了解的,给点入...

小矩阵
2014/01/11
967
1
Akka 指南 之「Akka 简介」

Akka 简介 欢迎来到 Akka,它是一组用于设计跨越处理器和网络的可扩展、弹性系统的开源库。Akka 允许你专注于满足业务需求,而不是编写初级代码来提供可靠的行为、容错性和高性能。 许多常见...

维C果糖
01/13
0
0

没有更多内容

加载失败,请刷新页面

加载更多

java通过ServerSocket与Socket实现通信

首先说一下ServerSocket与Socket. 1.ServerSocket ServerSocket是用来监听客户端Socket连接的类,如果没有连接会一直处于等待状态. ServetSocket有三个构造方法: (1) ServerSocket(int port);...

Blueeeeeee
今天
6
0
用 Sphinx 搭建博客时,如何自定义插件?

之前有不少同学看过我的个人博客(http://python-online.cn),也根据我写的教程完成了自己个人站点的搭建。 点此:使用 Python 30分钟 教你快速搭建一个博客 为防有的同学不清楚 Sphinx ,这...

王炳明
昨天
5
0
黑客之道-40本书籍助你快速入门黑客技术免费下载

场景 黑客是一个中文词语,皆源自英文hacker,随着灰鸽子的出现,灰鸽子成为了很多假借黑客名义控制他人电脑的黑客技术,于是出现了“骇客”与"黑客"分家。2012年电影频道节目中心出品的电影...

badaoliumang
昨天
15
0
很遗憾,没有一篇文章能讲清楚线程的生命周期!

(手机横屏看源码更方便) 注:java源码分析部分如无特殊说明均基于 java8 版本。 简介 大家都知道线程是有生命周期,但是彤哥可以认真负责地告诉你网上几乎没有一篇文章讲得是完全正确的。 ...

彤哥读源码
昨天
15
0
jquery--DOM操作基础

本文转载于:专业的前端网站➭jquery--DOM操作基础 元素的访问 元素属性操作 获取:attr(name);$("#my").attr("src"); 设置:attr(name,value);$("#myImg").attr("src","images/1.jpg"); ......

前端老手
昨天
7
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部