java actor akka_Java akka框架入门学习
[日期:2020.04.20-2020.04.22]
看完下面的入门介绍之后,再看如下链接(对akka框架整体介绍)https://github.com/guobinhit/akka-guidegithub.com
旧版参考链接参考链接github.com
以下是新版入门参看链接,介绍也会围绕新本链接展开(该链接的介绍与提供的代码一致)Akka Quickstart with Javadeveloper.lightbend.com
一、Actor Systems介绍https://doc.akka.io/docs/akka/2.0.5/general/actor-systems.html#actor-systemsdoc.akka.io
Actor是一个object,包含state和behavior,actor之间利用消息通信。每个actor可以递归地启动孩子(child)actor;每个actor受唯一的actor控制——启动它的actor(parent actor)。
利用actor建模一个解决方案,思路如下:将任务拆解成一系列子任务,分配给不同的actor 完成;每个actor可以递归的拆解自己的任务,分配给自己的child actors 去完成,也可以向parent actor发送消息声明无法处理,由parent actor 进一步处理。
Actor system 作为一组相互的actor,适合用于开发系统中需要共享功能的组件,比如scheduling services、configuration、logging等等。不同配置的actor system可以共存于同一个JVM而不会产生问题。
Actor接收(accept)的消息类型+回复(reply)的消息类型,定义该actor所行使的协议(protocol)。
异步通信
Actor模型是响应式和消息驱动的。将每个actor 看成一个邮箱,actor可以向其它actor发送邮件、可以检查自己的邮箱;actor在发送邮件之后并不被阻塞,而是可以自由地执行其他任务。同一个actor向另外一个actor发送消息的顺序可以得到保证,不同actor发送的消息之间不能得到保证。
actor在不收发消息的时候是处于suspend状态,不消耗占用内存以外的其他资源。
最佳实践actors最好只用于消息传递,a.k.a 处理发生的事件、产生对应的回复。尽量避免阻塞actor,如避免lock、network socket等,这些工作应当由专门的线程去做,这些线程只要与相关actor 通信即可。
actor之间传递的消息最好是immutable的,即定义的对象需要是不可变的。否则存在并发等问题。
发送的消息最好不要包括actor的行为,单纯发送消息。
actor 系统需要精心设计为hierarchical的,top-level的actor往往存在发生错误的根源问题。top-level 的actor需要精心设计,将actor system看成树形,最好设计成上瘦下胖的性状。
将某个actor相关的message定义为AbstractBehaavior类的静态内部类(public static final class)。这样能清楚地表示某个actor能够处理哪种类型的message。
通过工厂方法获得初始actor
二、akka Java apiJava API - Akka Documentationdoc.akka.io
Class ActorSystem 类
ActorSystem是akka的入口,它由一个名字和guardian actor创建,guardian做一些bootstrap的工作。ActorSystem的api之一由Behavior对象通过(akka.actor.typed.Behavior ,java.lang.String)创建。该对象描述了当前actor system层次结构的根Actor,并可以在该Actor下面创建其他Actor。ActorSystem 实现了
ActorSystemdoc.akka.ioCreating the Actorsdeveloper.lightbend.com
class ActorRef 类
这是actor handle(类似句柄、指针的语义),它可以在localhost也可以不在localhost上,可以被传递到不同的ActorSystem中。ActorRef可以被放在消息中传递。
ActorRef的tell方法,用于向其控制的actor 发送消息,并且是异步非阻塞的。
创建Actor
在akka中不能使用new创建actor,而是使用ActorContext的静态工厂方法spawn创建actor。spawn并不返回actor实例,而是返回指向actor实例的句柄/引用akka.actor.typed.ActorRef;这层抽象使得在使用ActorRef操作actor时保持位置透明(不用关心actor实际在同一个进程还是不同进程、甚至不同机器)。
Class Behavior 类
actor 的behavior 定义了它接收到消息后作出的对应行为。Behaviordoc.akka.io
AbstractBehavior
actor是一组内部状态+行为的组合;内部状态在接发消息的过程中发生改变,所以定义时需要传入继承了AbstractBehavior(行为)的类作为参数。
这是Behavior的抽象类,要在actor system中定义新的actor(只?)需定义一个继承AbstractBehavior的类(实际上是定义了一个行为),然后用parent actor 的context.spawn 方法创建新的actor,或者用ActorSystem的create方法创建新的actor。
在继承AbstractBehavior的子类中实现create静态方法,利用Behavior.setup()函数创建
public static Behavior create() {
return Behaviors.setup(SomeBehavior::new);
}
继承AbstractBehavior而自定义的actor,重载以下接收到消息时的方法
public Receive createReceive() {
return newReceiveBuilder().onMessage(Message.class, this::onMessage).build();
}
并提供actor 消息处理的方法(即createReceive 方法中的onMessage方法,在实际定义时可为该方法定义一个更有意义的名字):
private Behavior onMessage(MessageClass mc){
//做出行为、修改状态、打印日志...操作
// 如打印日志 getContext().getLog().info("Hello {}!", command.whom);
return this;
}
ActorContext
Actor包含Behavior和context,behavior在context中执行。Actor在处理消息时可以执行如下操作:发送有限数量的消息到另外一个actor
创建有限数量的actor
指定下一个消息的行为
Test测试
测试使用链接如下https://doc.akka.io/docs/akka/2.6/typed/testing-async.htmldoc.akka.io
使用TestKitJunitResource;以代码+注释的形式说明
package $package$;
import akka.actor.testkit.typed.javadsl.TestKitJunitResource;
import akka.actor.testkit.typed.javadsl.TestProbe;
import akka.actor.typed.ActorRef;
import org.junit.ClassRule;
import org.junit.Test;
public class AkkaQuickstartTest {
//定义测试kit @ClassRule
public static final TestKitJunitResource testKit = new TestKitJunitResource();
@Test
public void testGreeterActorSendingOfGreeting() {
//定义用于接收回复的actor TestProbe testProbe = testKit.createTestProbe();
//定义待测试的actor ActorRef underTest = testKit.spawn(Greeter.create(), "greeter");
//向待测试的actor发送消息,并用testProbe接收回复 underTest.tell(new Greeter.Greet("Charles", testProbe.getRef()));
//检查回复是否正确 testProbe.expectMessage(new Greeter.Greeted("Charles", underTest));
}
}
java actor akka_Java akka框架入门学习相关推荐
- SSM框架入门学习记录
SSM框架入门学习记录 //项目结构 在这里插入图片描述 在这里插入图片描述 包名多种多样,命名习惯问题. 流程:Controller(接受请求)-->Service(biz)(bl)(写业务函 ...
- Java的3大框架都学习什么呢?
Java是互联网行业的第一编程语言,相信大家都已经有了解了,事实也确实如此,Java还是世界第一编程语言,在学习Java的过程中,框架是程序员们必学的知识点,而且是十分重要的应用,Spring.Str ...
- keras框架入门学习(一)——argparse传参模块调用
keras框架入门学习(一)--argparse传参模块调用 一.argparse模块简介 1.1 argparse的定义 1.2 argparse的优势 二.argparse模块使用 2.1 实现[ ...
- EasyUI框架入门学习
为什么80%的码农都做不了架构师?>>> 前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给 ...
- java -jar 默认参数_JAVA入门学习指南,建议收藏
如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 . 让我们出发吧!ps:本文有点长,耐心阅读 . 〇,编程环境 ...
- c和java哪个好学_编程入门学习c++和Java哪个比较好
编程入门学习c++和Java哪个比较好 发布时间:2020-04-25 16:54:41 来源:亿速云 阅读:231 作者:栢白 编程入门学习c++和Java哪个比较好?如今这些都是小白比较关心的,如 ...
- 1、MyBatis框架入门学习CRUD
文章目录 框架前言 名词辨析 JavaWeb阶段回顾 框架介绍 ORM框架 MyBatis简介 MyBatis入门案例 1.环境准备 2.新建普通Maven项目,导入依赖 3.MyBatis核心配置文 ...
- C、C++、Java到Python,编程入门学习什么语言好?
最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C.Java和Python依然蝉联前三位.万万没想到的是,R语言居然冲到了第八位,创下了史上最佳记录.而且后续随着业内对数据统计和挖掘需求的上涨,R ...
- 国内优秀开源框架Guns框架入门学习
Guns下载路径:https://gitee.com/naan1993/guns 一.Guns简介 Guns是国内一个非常优秀的开源框架,功能就是快速搭建后台应用系统,Guns基于SpringBoot ...
最新文章
- mysql 打开文件数_MySQL打开的文件描述符限制
- wxWidgets:wxActiveXContainer类用法
- 怎么在ReactNative里面使用Typescript
- Redis学习笔记(五) 总结
- php ftp login,关于php ftp_login()函数的10篇文章推荐
- WSL2支持GPU使用docker
- DNS在什么情况下才能动态更新|活动目录集成的dns区域
- cvtcolor函数_5 OpenCV几个函数操作实例
- 暂停按钮_年报巨亏400多亿,国内钾肥龙头启动暂停上市按钮
- Delphi入门教程
- iOS 基础入门--Bull' Eye 小游戏
- 【人工大猩猩部队优化算法】基于人工大猩猩部队优化算法求解单目标优化问题(GTO)含Matlab源码
- 马云为何学计算机,IT大佬高考:李彦宏是状元 马云数学仅1分
- 前端框架UMI3基础知识和快速上手
- PHP页面间参数传递
- win7下计算机假死,win7系统电脑假死机怎么办
- Problem A: 薪酬计算
- Hook其他程序中的StringGrid的内容(内牛满面,终于找到了。)
- jmeter压测部分参数优化
- Python量化入门(1)- 开发环境的准备
热门文章
- 十四、系统与环境函数
- 网易的每一个产品都将因强制升级而死掉,先是泡泡,现在是闪电邮,下一个会是什么?......
- 乐视云如何炼成弹性支撑百万级别直播流
- Python出现bad color sequence错误的某一种解决办法
- 布隆过滤器速度_布隆过滤器(Bloom Filter)详解
- Python实现查票以及自动购票....再也不用愁手速不够啦~
- 糖果传奇的成功之路:三消游戏货币化技巧
- 条件编译指令(符号),C语言条件编译指令完全攻略
- ios 边录音边放_iOS 音频视频播放器实现边下载边播放缓存视频
- 数据库管理系统软件(DBMS)的几种简介(随笔)