Акка: пытаясь понять порядок доставки сообщений между актерами - PullRequest
0 голосов
/ 31 января 2019

Мне интересно, почему сообщения печатаются в том же порядке, что и в коде.

import akka.actor.AbstractActor
import akka.actor.ActorRef
import akka.actor.ActorSystem
import akka.actor.Props
import akka.event.Logging
import akka.event.LoggingAdapter

data class Request(val name: String)

class Device : AbstractActor() {
    val log = Logging.getLogger(getContext().getSystem(), this);

    override fun createReceive(): Receive {
        return receiveBuilder().matchEquals("print") { x -> log.info("hello i'm a device") }
                .match(Request::class.java) { x -> log.info("A " + x.name) }
                .build()
    }

    companion object {
        fun props(): Props {
            return Props.create { Device() }
        }
    }
}


fun main(args: Array<String>) {
    val system = ActorSystem.create("container")
    val deviceA = system.actorOf(Device.props())
    val deviceC = system.actorOf(Device.props())
    val deviceD = system.actorOf(Device.props())


    val deviceB = system.actorOf(Device.props())

    deviceA.tell(Request("first "), deviceB)
    deviceA.tell(Request("second"), deviceC)
    deviceA.tell(Request("third"), deviceD)



}

Он печатает:

/usr/lib/jvm/java-8-oracle/bin/java -Dvisualvm.id=32047598721041 -javaagent:/opt/intellij-idea-community/lib/idea_rt.jar=41737:/opt/intellij-idea-community/bin -Dfile.encoding=UTF-8 -classpath /usr/lib/jvm/java-8-oracle/jre/lib/charsets.jar:/usr/lib/jvm/java-8-oracle/jre/lib/deploy.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/cldrdata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/dnsns.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jaccess.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/jfxrt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/localedata.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/nashorn.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunec.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunjce_provider.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/sunpkcs11.jar:/usr/lib/jvm/java-8-oracle/jre/lib/ext/zipfs.jar:/usr/lib/jvm/java-8-oracle/jre/lib/javaws.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jce.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfr.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jfxswt.jar:/usr/lib/jvm/java-8-oracle/jre/lib/jsse.jar:/usr/lib/jvm/java-8-oracle/jre/lib/management-agent.jar:/usr/lib/jvm/java-8-oracle/jre/lib/plugin.jar:/usr/lib/jvm/java-8-oracle/jre/lib/resources.jar:/usr/lib/jvm/java-8-oracle/jre/lib/rt.jar:/home/dell/akka-quickstart-java/target/classes:/home/dell/.m2/repository/com/typesafe/akka/akka-actor_2.12/2.5.19/akka-actor_2.12-2.5.19.jar:/home/dell/.m2/repository/org/scala-lang/scala-library/2.12.8/scala-library-2.12.8.jar:/home/dell/.m2/repository/com/typesafe/config/1.3.3/config-1.3.3.jar:/home/dell/.m2/repository/org/scala-lang/modules/scala-java8-compat_2.12/0.8.0/scala-java8-compat_2.12-0.8.0.jar:/home/dell/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk8/1.3.20/kotlin-stdlib-jdk8-1.3.20.jar:/home/dell/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib/1.3.20/kotlin-stdlib-1.3.20.jar:/home/dell/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-common/1.3.20/kotlin-stdlib-common-1.3.20.jar:/home/dell/.m2/repository/org/jetbrains/annotations/13.0/annotations-13.0.jar:/home/dell/.m2/repository/org/jetbrains/kotlin/kotlin-stdlib-jdk7/1.3.20/kotlin-stdlib-jdk7-1.3.20.jar StuffKt
[INFO] [01/31/2019 18:43:16.058] [container-akka.actor.default-dispatcher-2] [akka://container/user/$a] A first 
[INFO] [01/31/2019 18:43:16.059] [container-akka.actor.default-dispatcher-2] [akka://container/user/$a] A second
[INFO] [01/31/2019 18:43:16.059] [container-akka.actor.default-dispatcher-2] [akka://container/user/$a] A third



Я ожидал, что порядок будет иногда отличаться от («первая вторая треть»), но он продолжает печатать тот же самый порядок на каждомзапустить.

Мои ожидания неверны?

1 Ответ

0 голосов
/ 31 января 2019

В документации о порядке доставки сообщений говорится

Более конкретно, правило состоит в том, что для данной пары участников сообщения отправляются непосредственно с первого на второене будет получен вне очереди .Слово прямо подчеркивает, что эта гарантия применяется только при отправке с оператором Tell в конечный пункт назначения, а не при использовании посредников или других функций распространения сообщений (если не указано иное).

Вы отправляете с основногометод (вне системы акторов): deviceA.

Вы не отправляете от deviceB, deviceC или deviceD актеров.Они просто используются как ссылки на отправителей, поэтому у deviceA есть кто-то, кто ответит на .

...