繁体   English   中英

将消息发送到池中的特定路由

[英]Sending a message to a specific routee in a pool

假设我有一群Routee演员,并且每个演员都有自己的“下属”演员,需要与之进行交流。 当下属将一条消息发送回“父”路由时,似乎该消息也正在通过路由器传递,因此无法保证会将该消息传递到适当的路由器。 因此,请使用以下代码:

class MyActor extends Actor {

    val router = context.actorOf(FromConfig.props(Props(new Routee)), "myrouter")

    def receive = {

        case msg: SomeMsg => router ! msg
    } 

}

class Routee extends Actor {

    val sub = context.actorOf(Props(new Subordinate(this)))
    var waiting = false

    def receive = {

        case msg: SomeMsg => 
            if (! waiting) {
                waiting = true
                sub ! msg
            }

        case ack: SomeAck =>
            waiting = false
            if (ack.routee != this) println("From a different subordinate")
    }
}

class Subordinate(routee: Routee) extends Actor {

    def receive = {

        case msg: SomeMsg =>
            sender ! SomeAck(routee)
    }

}

因此,如果我运行下面的代码,这将导致打印“来自其他下属”消息:

    val actor = ActorSystem("test").actorOf(Props(new MyActor), "myactor")
    while (true) actor ! SomeMsg()

无法保证我将确认发送回适当的路由。 确认是通过路由器传递的,是否可以解决?

组态:

akka {
    actor {
        provider = "akka.remote.RemoteActorRefProvider"

        deployment {
            /myactor/myrouter {
                router = balancing-pool
                nr-of-instances = 4
            }
        }
    }
    remote {
        enabled-transports = ["akka.remote.netty.tcp"]
        netty.tcp {
            hostname = "0.0.0.0"
            port = 2551
        }
    }
}

您正在使用balancing-pool ,这意味着路由将使用共享邮箱并“窃取”彼此的消息。 尝试使用round-robin-pool

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM