调用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节点
- 每一个actor系统具有三个顶级的actor(称为guardians),是在开始时自动产生的
- 监管者做什么?
- 对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被传递