• akka学习


    调用akka

    • 111
      • 222
      • 222
        • 22
    • 111
    • 111

    12222

    调用akka

    关键概念

    ActorSystem

    AbstracActor

    ActorRef

    createRecive()

    tell()

    Patterns.ask()

    -

    动态的Actor创建

    • 在java中我们可以发现tasks可以创建tasks
    • 在akka java中,actors也能创建actors
      • actor的创建可以通过调用ActorSystem对象的actorOf()方法
      • 也可以通过ActorContext对象的actorOf方法
        • 一个ActorContext对象包裹一个actor
        • 为了获取一个AbstractActor actor的ActorContext,可以调用getContext的实例方法
    • 监管supervision
    • 每个actor正好有一个监管actor
    • 当一个actor使用第一个actor的context创建另一个时,那么第一个actor就是第二个actor的监管
      •   第一个actor通常被称为parent
      • 第二个通常被称为child或者subordinate
    • 那么通过ActorSystem的actorOf()方法创建呢?
      • 每一个actor系统具有三个顶级的actor(称为guardians),是在开始时自动产生的
        • /
        • /system
        • /user
      • 当一个对象在ActorSystem中使用actorOf被创建,它默认是/user的child节点
    • 监管者做什么?
      • 对child代理任务    
      • 当children失败的时候矫正action
    • 在akka中监管者是错误容忍的地方。

    获取监管数据

    ActorContext有许多方法检索parent、child的信息,例如:

    1、ActorRef parent()方法,返回被context绑定的actor的parent

    2、java.lang.Iterable<ActorRef> getChildren()方法,返回children作为java的迭代器

    3、ActorRef getChild(String name)方法,通过name返回child,后者weinull

    为了获取指定的parent,可以通过下面的调用:getContext().parent()

    监管的继承体系

    监管者的关系是一棵树tree,每个actor(除了/)只有一个parent,每个actor有零个或多个children

    每个actor可以通过path(ActorPath)被指定

    为了获取ActorRef的路径,可以通过path()实例方法

    有一个张图可以解释:parent、children、path概念

    Actor怎么发现它的名字?

    通过ActorPath,ActorPath对象具有name()方法返回这个路径actor的name(String类型),因此getSelf().path().name()返回自身的名字name

    获取receiveBuilder()?有两种方式

    //OLD
    public class SomeActor extends AbstractActor{
        public SomeActor(){
            receive(ReceiveBuilder
    .match(String.class,this::onMessage)
    .build());
        }
    }
    
    //NEW    
    @Override
    public Receive createReceive() {
    return receiveBuilder()
    .match(String.class, this::onMessage)
    .build();
    }

    监管者详细信息

    当一个actor抛出异常的时候,一个特殊的系统msg被发送给它的parent。

    此时Parent actor有四种选择:

    1、恢复,2、重启,3、停止,4、恶化

    这些选择的交流是是一个系统的msg,可以通过特殊的system-msg队列完成。

    恢复失败的child,createReceive()方法被重新调用,当失败发生的时候lost的msg被传递

  • 相关阅读:
    解锁 redis 锁的正确姿势
    PHP实现Redis单据锁,防止并发重复写入
    js笔记
    FormData使用方法详解
    jquery里用each遍历的值存到数组和字符串
    Sublime Text3 安装 CTags 插件出现乱码
    通过pd.to_sql()将DataFrame写入Mysql
    ERROR 2002 (HY000): Can't connect to local MySQL server through socket
    pandas 从txt读取DataFrame&DataFrame格式化保存到txt
    pandas 取消读取csv时默认第一行为列名
  • 原文地址:https://www.cnblogs.com/li-daphne/p/12689609.html
Copyright © 2020-2023  润新知