[日期:2020.04.20-2020.04.22]

看完下面的入门介绍之后,再看如下链接(对akka框架整体介绍)https://github.com/guobinhit/akka-guide​github.com

旧版参考链接参考链接​github.com

以下是新版入门参看链接,介绍也会围绕新本链接展开(该链接的介绍与提供的代码一致)Akka Quickstart with Java​developer.lightbend.com

一、Actor Systems介绍https://doc.akka.io/docs/akka/2.0.5/general/actor-systems.html#actor-systems​doc.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 Documentation​doc.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 实现了

ActorSystem​doc.akka.ioCreating the Actors​developer.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 定义了它接收到消息后作出的对应行为。Behavior​doc.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.html​doc.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框架入门学习相关推荐

  1. SSM框架入门学习记录

    SSM框架入门学习记录 //项目结构 在这里插入图片描述 在这里插入图片描述 包名多种多样,命名习惯问题. 流程:Controller(接受请求)-->Service(biz)(bl)(写业务函 ...

  2. Java的3大框架都学习什么呢?

    Java是互联网行业的第一编程语言,相信大家都已经有了解了,事实也确实如此,Java还是世界第一编程语言,在学习Java的过程中,框架是程序员们必学的知识点,而且是十分重要的应用,Spring.Str ...

  3. keras框架入门学习(一)——argparse传参模块调用

    keras框架入门学习(一)--argparse传参模块调用 一.argparse模块简介 1.1 argparse的定义 1.2 argparse的优势 二.argparse模块使用 2.1 实现[ ...

  4. EasyUI框架入门学习

    为什么80%的码农都做不了架构师?>>>    前言 新项目的开发前端技术打算采用EasyUI框架(基于EasyUI较为丰富的UI组件库),项目组长将前端EasyUI这块的任务分配给 ...

  5. java -jar 默认参数_JAVA入门学习指南,建议收藏

    如果你不懂Java 并且想认真学习接触了解一下Java的语法,建议把这篇文章收藏了,多看几遍,应该可以初步掌握Java 大部分基础的语法 . 让我们出发吧!ps:本文有点长,耐心阅读 . 〇,编程环境 ...

  6. c和java哪个好学_编程入门学习c++和Java哪个比较好

    编程入门学习c++和Java哪个比较好 发布时间:2020-04-25 16:54:41 来源:亿速云 阅读:231 作者:栢白 编程入门学习c++和Java哪个比较好?如今这些都是小白比较关心的,如 ...

  7. 1、MyBatis框架入门学习CRUD

    文章目录 框架前言 名词辨析 JavaWeb阶段回顾 框架介绍 ORM框架 MyBatis简介 MyBatis入门案例 1.环境准备 2.新建普通Maven项目,导入依赖 3.MyBatis核心配置文 ...

  8. C、C++、Java到Python,编程入门学习什么语言好?

    最近,TIOBE更新了7月的编程语言榜单,常年霸榜的C.Java和Python依然蝉联前三位.万万没想到的是,R语言居然冲到了第八位,创下了史上最佳记录.而且后续随着业内对数据统计和挖掘需求的上涨,R ...

  9. 国内优秀开源框架Guns框架入门学习

    Guns下载路径:https://gitee.com/naan1993/guns 一.Guns简介 Guns是国内一个非常优秀的开源框架,功能就是快速搭建后台应用系统,Guns基于SpringBoot ...

最新文章

  1. mysql 打开文件数_MySQL打开的文件描述符限制
  2. wxWidgets:wxActiveXContainer类用法
  3. 怎么在ReactNative里面使用Typescript
  4. Redis学习笔记(五) 总结
  5. php ftp login,关于php ftp_login()函数的10篇文章推荐
  6. WSL2支持GPU使用docker
  7. DNS在什么情况下才能动态更新|活动目录集成的dns区域
  8. cvtcolor函数_5 OpenCV几个函数操作实例
  9. 暂停按钮_年报巨亏400多亿,国内钾肥龙头启动暂停上市按钮
  10. Delphi入门教程
  11. iOS 基础入门--Bull' Eye 小游戏 
  12. 【人工大猩猩部队优化算法】基于人工大猩猩部队优化算法求解单目标优化问题(GTO)含Matlab源码
  13. 马云为何学计算机,IT大佬高考:李彦宏是状元 马云数学仅1分
  14. 前端框架UMI3基础知识和快速上手
  15. PHP页面间参数传递
  16. win7下计算机假死,win7系统电脑假死机怎么办
  17. Problem A: 薪酬计算
  18. Hook其他程序中的StringGrid的内容(内牛满面,终于找到了。)
  19. jmeter压测部分参数优化
  20. Python量化入门(1)- 开发环境的准备

热门文章

  1. 十四、系统与环境函数
  2. 网易的每一个产品都将因强制升级而死掉,先是泡泡,现在是闪电邮,下一个会是什么?......
  3. 乐视云如何炼成弹性支撑百万级别直播流
  4. Python出现bad color sequence错误的某一种解决办法
  5. 布隆过滤器速度_布隆过滤器(Bloom Filter)详解
  6. Python实现查票以及自动购票....再也不用愁手速不够啦~
  7. 糖果传奇的成功之路:三消游戏货币化技巧
  8. 条件编译指令(符号),C语言条件编译指令完全攻略
  9. ios 边录音边放_iOS 音频视频播放器实现边下载边播放缓存视频
  10. 数据库管理系统软件(DBMS)的几种简介(随笔)