Akka入门实例

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 方法创建上面的 Actor1 类对象实例,返回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 块可能被其它线程调用,引起条件竞争。
 
 
 
标签: Akkascalaactor并发

Akka入门实例的更多相关文章

  1. React 入门实例教程(转载)

    本人转载自: React 入门实例教程

  2. struts入门实例

    入门实例 1  .下载struts-2.3.16.3-all  .不摆了.看哈就会下载了. 2  . 解压  后 找到 apps 文件夹. 3.    打开后将 struts2-blank.war   ...

  3. Vue.js2.0从入门到放弃---入门实例

    最近,vue.js越来越火.在这样的大浪潮下,我也开始进入vue的学习行列中,在网上也搜了很多教程,按着教程来做,也总会出现这样那样的问题(坑啊,由于网上那些教程都是Vue.js 1.x版本的,现在用 ...

  4. wxPython中文教程入门实例

    这篇文章主要为大家分享下python编程中有关wxPython的中文教程,分享一些wxPython入门实例,有需要的朋友参考下     wxPython中文教程入门实例 wx.Window 是一个基类 ...

  5. Omnet++ 4.0 入门实例教程

    http://blog.sina.com.cn/s/blog_8a2bb17d01018npf.html 在网上找到的一个讲解omnet++的实例, 是4.0下面实现的. 我在4.2上试了试,可以用. ...

  6. Spring中IoC的入门实例

    Spring中IoC的入门实例 Spring的模块化是很强的,各个功能模块都是独立的,我们可以选择的使用.这一章先从Spring的IoC开始.所谓IoC就是一个用XML来定义生成对象的模式,我们看看如 ...

  7. Node.js入门实例程序

    在使用Node.js创建实际“Hello, World!”应用程序之前,让我们看看Node.js的应用程序的部分.Node.js应用程序由以下三个重要组成部分: 导入需要模块: 我们使用require ...

  8. Java AIO 入门实例(转)

    Java7 AIO入门实例,首先是服务端实现: 服务端代码 SimpleServer: public class SimpleServer { public SimpleServer(int port ...

  9. Asp.Net MVC2.0 Url 路由入门---实例篇

    本篇主要讲述Routing组件的作用,以及举几个实例来学习Asp.Net MVC2.0 Url路由技术. 接着上一篇开始讲,我们在Global.asax中注册一条路由后,我们的请求是怎么转到相应的Vi ...

随机推荐

  1. 《Javascript语言精粹》 读书笔记

    1 6种值被当做假:false.null.undefined.空字符串''.数字0.数字NaN,其他所有值都为真,包括"false" 2 typeof有6种值,分别是'number ...

  2. C#从SQL server数据库中读取l图片和存入图片

    原文:C#从SQL server数据库中读取l图片和存入图片 本实例主要介绍如何将图片存入数据库.将图片存入数据库,首先要在数据库中建立一张表,将存储图片的字段类型设为Image类型,用FileStr ...

  3. 我也来谈javascript高级编程之:javascript函数编译过程

    前言 题目有点大,其实也就是手痒...跟大家来扯一下javascript编译过程. 那么到底什么是“编译”呢 这个...本人文笔太差,我还是直接举例子吧. 相信玩过js童鞋应该都看过下面这样一个面试题 ...

  4. C++11实现模板手柄:委托构造函数、defaultkeyword分析

    C++11.使用委托构造函数.和高速变量初始化,defaultkeyword重新声明默认构造函数,回答pod状态. 分析与推荐的方法. 到目前为止,VS2012和2013异常声明兼容还是停留在通信代码 ...

  5. 平均得分 【杭州电-HDOJ-2023】 附加题+详细说明

    /* 平均得分 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Su ...

  6. java 不寻常的问题 No bean named 'sessionFactory' is defined 和 initialize a collection of role

    左右java的"No bean named 'sessionFactory' is defined "  现在经常出去SHH或在其框架内Sping+JPA使用底部HIbernate ...

  7. A + B Again 2057 有符号的64进位的运算

    Problem Description There must be many A + B problems in our HDOJ , now a new one is coming.Give you ...

  8. ArcGIS 10.1 for Server 扩展开发(SOE)

    原文连接:http://blog.csdn.net/arcgisserver_book/article/details/7869368 第一章为什么使用SOE 在ArcGIS 10.1中ArcGIS ...

  9. 浅谈JavaScript中typeof与instanceof的区别

      首先,我们从其常规定义入手:       instanceof 运算符可以用来判断某个构造函数的 prototype 属性是否存在另外一个要检测对象的原型链上.(需要注意的一点是:prototyp ...

  10. Cocos2d-x 3.2 大富翁游戏项目开发-第五部分 单机游戏-级别选择ScrollView

    于MenuScene.cpp 点击单机游戏后会调用 Director::getInstance()->pushScene(MapChooseScene::createScene()); 进入到关 ...