Akka入门实例

摘要:
Akka入门实例Akka是一个用Scala编写的库,用于简化编写容错的、高可伸缩性的Java和Scala的Actor模型应用。"如上代码所示,通过AKKA中的ActorSystem对象的actorOf方法创建上面的Actor1类对象实例,返回AKKA中的ActorRef类型的EchoServer对象,echoServer对象是EchoServer类对象实例的引用,通过echoServer对象可以向EchoServer类对象实例发送消息。

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 packagefoo
2 
3 importakka.actor.{ Actor, ActorSystem, Props}
4 importakka.event.Logging
5 
6 object test extendsApp {
7     
8 val system =ActorSystem()
9 
10 class EchoServer extendsActor {
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 packagefoo
2 
3 importakka.actor.{ Actor, ActorSystem, Props}
4 importakka.event.Logging
5 
6 object test extendsApp {
7     
8 val system =ActorSystem()
9 
10 class Actor2(name:String) extendsActor {
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 块可能被其它线程调用,引起条件竞争。

免责声明:文章转载自《Akka入门实例》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇ESlint中console.log报错问题SpringMVC整合freeMarker实现页面静态化+SpringMVC配置多视图下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

post请求body格式

在PostMan中用Post方式,Body有form-data,x-www-form-urlencoded,raw,binary四种。 其中raw又分以下7种。 现在来区分一下: form-data是http请求中的multipart/form-data,它会将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。当上传的...

《精通并发与Netty》学习笔记(13

一、粘包/拆包概念 TCP是一个“流”协议,所谓流,就是没有界限的一长串二进制数据。TCP作为传输层协议并不不了解上层业务数据的具体含义,它会根据TCP缓冲区的实际情况进行数据包的划分,所以在业务上认为是一个完整的包,可能会被TCP拆分成多个包进行发送,也有可能把多个小的包封装成一个大的数据包发送,这就是所谓的TCP粘包和拆包问题。 一般所谓的TCP粘包是...

深入浅出MFC学习笔记 消息

本章将会对MFC的消息映射和命令传递机制做深入探讨。 MFC规定了消息传递的路线,消息会按照这个路线传递下去,找不到归宿的话就交给DefWindowProc。 在产生窗口之前,如果我们在创建窗口时指定的窗口类为NULL时,MFC会自动注册五个默认的窗口类,每个窗口类有自己的窗口函数。不同窗口得到的消息应该交由不同的窗口函数来处理。所谓的命令传递机制是为了让...

ROS学习之消息包

  一个包是ROS中用于存储ROS 消息数据的文件格式。包 的扩展名为.bag - 在ROS中具有重要作用,并且已经编写了各种各样的工具来允许您存储,处理,分析和可视化它们。  在线计算图中使用 包通常由诸如rosbag的工具创建,该工具订阅一个或多个ROS 主题,并且将序列化的消息数存储在接收到的文件中。这些包文件也可以在ROS中回放到与他们记录的相...

easy-wechat

https://www.easywechat.com/docs/master/installation -----其它的回复 创建菜单自定义菜单事件 地理位置回复素材发送一次性订阅消息 与 发送模板消息 -------- easy-wechat获取微信服务器 IP (或IP段) $ips = $app->base->getValidIps();...

4wpa_supplicant适配层 详解

适配层是 通用的wpa_supplicant的 封装,在Android中 作为 WiFi部分的 硬件抽象层来使用。wpa_supplicant适配层 主要用于 与wpa_supplicant守护进程 的 通信,以提供给Android框架使用,它实现了 加载、控制 和 消息监控等功能。           1、当java层调用 loadDriver时, 它...