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被传递

猜你喜欢

转载自www.cnblogs.com/li-daphne/p/12689609.html
今日推荐