Akka(一):Akka的基本使用
1.akka是什么?
akka是一种基于Scala的网络编程库,实现了RPC框架。spark在1.6之前使用的是akka进行通信,1.6及以后是基于netty。现阶段的Flink是基于Akka+Netty。如果需要了解Spark或者Flink的网络通信,就必须得从akka开始。
2.Akka中的方法
主类是在akka.actor.Actor,Endpoint 有三个重要的声明周期方法:
- prestart():对象实例初始化之后自动执行
- receive(): 核心业务功能处理就在这里了
- postStop():对象实例销毁之前自动调用执行
3.简单样例
object SenderActorObject extends Actor {println("1231231")// 当Actor初次被调用化时override def preStart(): Unit = {println("abcdef")println("执行SenderActorObject PreStart()方法")}override def receive: Receive = {case "start" =>val receiveActor = this.context.actorSelection("/user/receiverActor")// 向第二个actor发送消息receiveActor ! SubmitTaskMessage("请完成#001任务!")case SuccessSubmitTaskMessage(msg) =>println("21312312")println(s"接收到来自${sender.path}的消息: $msg")}}object ReceiverActor extends Actor {override def preStart(): Unit = {print(1231)println("执行ReceiverActor()方法")}// 执行receive方法前会先执行preStart方法override def receive: Receive = {case SubmitTaskMessage(msg) =>println(s"接收到来自${sender.path}的消息: $msg")// 又向第一个sender发送消息sender ! SuccessSubmitTaskMessage("完成提交")case _ => println("未匹配的消息类型")}
}object SimpleAkkaDemo {def main(args: Array[String]): Unit = {// 创建一个actor系统val actorSystem = ActorSystem("SimpleAkkaDemo", ConfigFactory.load())//创建一个actorval senderActor: ActorRef = actorSystem.actorOf(Props(SenderActorObject), "senderActor")//创建一个actorval receiverActor: ActorRef = actorSystem.actorOf(Props(ReceiverActor), "receiverActor")println("abcdefghij")receiverActor ! "asda"println("afafa")// 使用actor的引用向actor发送消息senderActor ! "start"}
}
说明:
- ActorSystem 是管理 Actor生命周期的组件, Actor是负责进行通信的组件
- 每个 Actor 都有一个 MailBox,别的 Actor 发送给它的消息都首先储存在 MailBox 中,通过这种方式可以实现异步通信。
- 每个 Actor 是单线程的处理方式,不断的从 MailBox 拉取消息执行处理,所以对于 Actor 的消息处理,不适合调用会阻塞的处理方法。
- Actor 可以改变他自身的状态,可以接收消息,也可以发送消息,还可以生成新的 Actor
- 每一个ActorSystem 和 Actor都在启动的时候会给定一个 name,如果要从ActorSystem中,获取一个 Actor,则通过以下的方式来进行 Actor的获取:akka.tcp://asname@bigdata02:9527/user/actorname
- 如果一个 Actor 要和另外一个 Actor进行通信,则必须先获取对方 Actor 的 ActorRef 对象,然后通过该对象发送消息即可。
- 通过 tell 发送异步消息,不接收响应,通过 ask 发送异步消息,得到 Future 返回,通过异步回到返回处理结果。
注意以下几点:
- spark rpc生命周期方法:onStart()、receive()、onStop()
akka rpc生命周期方法:preStart()、receive() 、postStop() - 当一个actor被初始化时,会直接执行这个object中的非方法中的代码。当被ActorSystem调用时,会执行其preStart()方法。当有接收到消息后,会执行receive方法。
- 可以使用以下方式给某个指定的Actor发送消息:
//与master建立连接 selection = context.actorSelection("akka.tcp://MasterActorSystem@localhost:1111/user/MasterActor") //向master注册信息 selection ! Conf(workerId, 2040, 4)
也可以使用以下方式给发送者返回消息:
sender() ! Confed
- 定时任务:
/*** initialDelay: FiniteDuration, 多久以后开始执行* interval: FiniteDuration, 每隔多长时间执行一次* receiver: ActorRef, 给谁发送这个消息* message: Any 发送的消息是啥** 每隔4秒钟给自己发送SendMessage*/ import scala.concurrent.duration._ import context.dispatcher context.system.scheduler.schedule(0 millis, 4000 millis, self, SendMessage)
Akka(一):Akka的基本使用相关推荐
- Akka介绍(Akka 1)
1 Akka介绍 Akka运行在JVM上,能够构建高并发.分布式和高弹性的消息驱动应用程序的一个工具套件.Akka具有异步.高性能.扩展性等特性. 1.1 异步 异步能够对单一 ...
- akka java_java – Akka和Spring集成
我想让akka使用spring应用程序.这是一款完全符合akka模型的搜索应用程序.关于此集成的大多数在线示例和类型安全示例都讨论了使用akka扩展来注入spring应用程序上下文.但是,它们都使用A ...
- akka mysql_Spray + Akka高性能异步IO并发
Spray + Akka高性能异步IO并发 如何使用Java建立像Node.js那样非堵塞异步事件并发IO服务器呢?Spray是基于NIO2高并发框架,虽然Tomcat 8也是基于NIO2,但是Spa ...
- 【Akka】Akka 学习 akka 两本书的读后感
1.概述 我在学历akka两本书的时候,读后感如下. 首先是读取了< Akka实战:快速构建高可用分布式应用.pdf> 这本书非常的不错,从浅到深,讲解的也比较细.是一本入门的好书籍,缺点 ...
- 【akka】akka源码 Akka源码分析-FSM
1.概述 转载自己学习,建议直接看原文:Akka源码分析-FSM akka还有一个不常使用.但我觉得比较方便的一个模块,那就是FSM(有限状态机).我们知道了akka中Actor模型的具体实现之后,就 ...
- 【Akka】Akka Actor生命周期
1.概述 转载:Akka Actor生命周期 用于自我学习. Actor的生命周期是使用Hooks体现和控制的,我们可以重写相关的Hooks,从而实现对Actor生命周期各环节的细粒度控制.各事件发生 ...
- 【Akka】Akka容错处理
1.概述 转载:Akka容错处理 1.1 监督(Supervision) 容错(fault tolerance)概念与 Actor 相关,Actor 模型中容错处理使用叫做监督(supervision ...
- 【Akka】Akka 传递消息
1.概述 转载:Akka传递消息 1.1 消息传递 Akka 有 4 种核心的 Actor 消息模式: tell .ask .forward 和 pipe. Ask:向 Actor 发送一条消息,返回 ...
- 【akka】Akka源码分析-local-DeathWatch
1.概述 转载自己学习,建议直接看原文:Akka源码分析-local-DeathWatch 生命周期监控,也就是死亡监控,是akka编程中常用的机制.比如我们有了某个actor的ActorRef之后, ...
- 【Akka】Akka并发编程设计
1.概述 转载:Akka并发编程设计 2. 响应式系统设计 Akka 被称为是一个响应式平台,更具体的说,它是 Typesafe 响应式平台的一部分.响应式宣言中包含了 4 个准则,也可以说是设计目标 ...
最新文章
- 模板网站建设过程中需要注意哪些细节问题?
- Python numpy生成矩阵、串联矩阵
- 在64位windows下使用instsrv.exe和srvany.exe创建windows服务
- debian8.7.1安装zabbix3.2
- 三种方法生成随机数之srand篇
- python常用单词有多少_Python常用单词
- Android5.0 netd架构流程
- python 矩量法_矩量法:β二项分布
- 精忠报国用计算机弹,同人精忠报国岳飞传
- fold/foldLeft/foldRight区别和联系
- ch3 电磁干扰的耦合和传播
- python Calendar日历模块函数介绍
- linux系统的种类
- win10 Xshell 中文无法输入问题
- 2022-09-15 mysql列存储引擎-语法树转换
- unity中凹凸贴图、法线贴图、视差贴图和位移贴图
- 反爬虫,看看互联网大厂是怎么玩的?
- Eclipse jee最新版 国内镜像较快的
- thinkphp5整合layuiadmin
- 互联网公司常用的分库分表方案【记录】
热门文章
- 编程语言python用什么笔记本最好_开发PC网站一般用什么编程语言
- 走进Vue【二】Vue3语法糖
- CSDN开发者周刊第 22期:谷歌 DeepMind 第四代:不学规则就可以玩游戏;图灵奖得主 Edmund Clarke 因感染“新冠”逝世;
- Matlab建模—导弹追踪问题
- TiDB Sysbench 性能对比测试报告 - v5.1.4 对比 v6.0.0 DMR
- Quartus 器件库的添加方法
- 华为鸿蒙系统研发团队,华为鸿蒙OS系统不再孤单!中兴近四千名员工:全力研发国产系统...
- MySQL之——安装 mysql.slave_master_info表不存在的解决方法
- 智慧社区养老解决方案——苏州新导智能
- 华为服务器怎么安装win7系统,远程服务器安装win7系统