zoukankan      html  css  js  c++  java
  • actor 内最好不要阻塞

    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 了吧,但它依然没有找到

  • 相关阅读:
    开发者论坛一周精粹(第九期)
    你刚吃的兰州牛肉面_背后就藏着大数据
    《C++覆辙录》——1.9:使用糟糕的语言
    老司机带你用MaxCompute和表格存储玩转车联网数据
    Gartner最新发布:2017年十大战略技术趋势
    js的事件的三个阶段,事件委托的原理
    Spring的AOP1
    了解SQL注入攻击
    了解XSS攻击
    了解Serialization
  • 原文地址:https://www.cnblogs.com/xinsheng/p/4615351.html
Copyright © 2011-2022 走看看