zoukankan      html  css  js  c++  java
  • Akka入门实例

    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并发
  • 相关阅读:
    [WebService]请求因 HTTP 状态 404 失败: Not Found。
    [WebService]请求因 HTTP 状态 400 失败: Bad Request。
    关于静态构造函数
    asp.net生成高质量缩略图通用函数
    ASP.NET 操作消息队列
    Asp.net 字符串操作类(补充引用)
    一行代码挂掉IE6,哈哈.......
    .Net代码生成器
    TSQL 跨库查询语句
    获取服务器地址的方法区别
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/3715211.html
Copyright © 2011-2022 走看看