码迷,mamicode.com
首页 > 其他好文 > 详细

actor 内最好不要阻塞

时间:2015-07-02 11:32:01      阅读:121      评论:0      收藏:0      [点我收藏+]

标签:

1. 在使用 akka cluster singleton 时,我需要知道被创建的 singleton proxy 的 actorRef,通过绝对路径加 actorSelection 方法,应该很容易得到此 actor 的 actorRef

main() {
    system.actorOf(ClusterSingletonManager.props(Master.props(Duration(99, "second")), "active",
            PoisonPill, None), "master")


    context.system.actorSelection("user/master/active").resolveOne(4 second).await ! ParentGreeting
        
}

  

上面的程序会报异常,actor not found

但是对于普通的 actor,却没有问题

val actorRef: ActorRef = system.actorOf(Master.props(10 second), "standalone")

actorRef ! ParentGreetings

  

不知道原因

 

2. 

对于1,我们假设 singleton actor 已经被创建,在 actor 内部获取自己的 actorRef

val core1: ActorRef = context.system.actorSelection("/user/master").resolveOne(Duration(10, "second")).await

val core2: ActorRef = context.system.actorSelection("/user/master/active").resolveOne(Duration(10, "second")).await

  

core1 成功得到(core1 是 clusterSingletonManager),core2 报错

 

3.

resolveOne 返回的是 Future[ActorRef],那么在 actor 内部尝试异步的方法

context.system.actorSelection("user/master/active").resolveOne(4 second).map(actor => actor ! ParentGreetings)

  

成功得到 actorRef 并且发送消息

 

解释:

对于2,3 我觉得可以理解成,resolveOne() 发送的 activity 消息给 singleton actor 后阻塞在那里,此次阻塞的不仅是这个语句,actor 自己也被阻塞了,它无法给自己再发一个消息,告诉自己的 activityId 信息,因此 resolveOne.await 等待 4 秒后,超时异常,actor not found 异常。

这种解释或许有道理,但是我觉得可能是错的,首先,我用的是 context.system,而不是 context 阻塞的应该不是当前 actor,曾经在stackoverflow 上看到过这个问题。其次,main 里的 resolveOne.await 总不会阻塞 actor 了吧,但它依然没有找到

 

actor 内最好不要阻塞

标签:

原文地址:http://www.cnblogs.com/xinsheng/p/4615351.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!