Можно ли отправлять дочернего актора напрямую или все сообщения должны передаваться от актора root вниз в Akka? - PullRequest
0 голосов
/ 13 июля 2020
• 1000 к go этому дочернему элементу передаются от /user и от / к /user. Я спрашиваю, потому что в учебнике IotSupervisor расширяет AbstractBehavior<Void>, и я предполагаю, что это нужно будет изменить на расширение AbstractBehavior<DeviceManager.Command>. Спасибо. [! [введите здесь описание изображения] [1]] [1]

РЕДАКТИРОВАТЬ: Чтобы обосновать это с помощью кода, я включил следующее:

package org.example;

import akka.actor.ActorRef;
import akka.actor.typed.ActorSystem;
import akka.http.javadsl.server.AllDirectives;
import akka.http.javadsl.server.HttpApp;
import akka.http.javadsl.server.Route;
import akka.util.Timeout;
import scala.concurrent.duration.FiniteDuration;

import static akka.pattern.PatternsCS.ask;

import java.util.concurrent.CompletionStage;
import java.util.concurrent.TimeUnit;


public class Application extends AllDirectives {
    public static class MinimalHttp extends HttpApp {
        ActorRef deviceManagerActorRef;

        @Override
        protected Route routes() {
            akka.actor.ActorSystem sys = this.systemReference.get();

            return concat(
                    path("hello", () ->
                            get(() -> {
                                final Timeout timeout = Timeout.durationToTimeout(FiniteDuration.apply(5, TimeUnit.SECONDS));
                                CompletionStage<org.example.DeviceManager.DeviceRegistered> regged = ask(sys.guardian(), new DeviceManager.RequestTrackDevice("group", "dev1", null), timeout)
                                        .thenApply(org.example.DeviceManager.DeviceRegistered.class::cast)
                                        .thenApply(r -> {
                                            System.out.println("payload>>>>>>"+r);
                                            return r;
                                        });
                                        regged = ask(sys.guardian(), new DeviceManager.RequestTrackDevice("group", "dev1", null), timeout)
                                                .thenApply(org.example.DeviceManager.DeviceRegistered.class::cast)
                                                .thenApply(r -> {
                                                    System.out.println("payload>>>>>>"+r);
                                                    return r;
                                                });
                                return complete("foo");
                            }
                            )));

        }
    }
    public static void main(String[] args) throws Exception {

        final ActorSystem typedSystem = ActorSystem.create(IotSupervisor.create(), "iot-sup");
        akka.actor.ActorSystem sys = typedSystem.classicSystem();
        final MinimalHttp server = new MinimalHttp();
        server.startServer("localhost", 8080, sys);
    }
}

Я сейчас получаю это:

11:27:40.134 [iot-sup-akka.actor.default-dispatcher-3] INFO akka.actor.LocalActorRef - Message [org.example.DeviceManager$RequestTrackDevice] from Actor[akka://iot-sup/temp/$a] to Actor[akka://iot-sup/user] was unhandled. [1] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.
11:27:40.134 [iot-sup-akka.actor.default-dispatcher-3] INFO akka.actor.LocalActorRef - Message [org.example.DeviceManager$RequestTrackDevice] from Actor[akka://iot-sup/temp/$b] to Actor[akka://iot-sup/user] was unhandled. [2] dead letters encountered. This logging can be turned off or adjusted with configuration settings 'akka.log-dead-letters' and 'akka.log-dead-letters-during-shutdown'.

в то время как я, по крайней мере, ожидаю, что creating group actor for group будет зарегистрировано, а также информация о вновь созданном устройстве будет записана. [1]: https://i.stack.imgur.com/MjVZD.png

...