Akka Remote Routing с использованием Java

Я пытаюсь реализовать базовый широковещательный маршрутизатор, в котором маршруты находятся на удаленных машинах.

Код выглядит следующим образом:

localApp.conf

akka {

    log-dead-letters = 10
    log-dead-letters-during-shutdown = off

    actor {
        provider = "akka.remote.RemoteActorRefProvider"
        serialize-messages = on

        serializers {
            java = "akka.serialization.JavaSerializer"
        }

        serialization-bindings {
            "java.lang.String" = java
            "test.akkaLocal.LocalWrapper" = java
        }

        deployment {
            /LocalMaster/broadcastRouter {
                router = "broadcast"
                nr-of-instances = 1
                target {
                    nodes = ["akka.tcp://RemoteApp@127.0.0.1:10175"]
                }
            }
        }
    }
    remote {
        enabled-transports = ["akka.remote.netty.tcp"]
        netty {
            tcp {
                hostname = "127.0.0.1"
                port = 10174
            }
        }
    }
}

LocalApp.java

public class LocalApp
{
    public static void main(String[] args)
    {
        LocalApp app = new LocalApp();
        app.executeLocal();
    }

    private void executeLocal() {
        ActorSystem system = ActorSystem.create("LocalApp", ConfigFactory.load("localApp"));
        final ActorRef master = system.actorOf(Props.create(LocalMaster.class), "LocalMaster");
        master.tell(new LocalWrapper.Execute(), ActorRef.noSender());
    }

    public static class LocalMaster extends UntypedActor {

        @Override
        public void onReceive(Object message) throws Exception {
            if (message instanceof LocalWrapper.Execute) {

                ActorSelection remoteActor =
                        getContext().actorSelection("akka.tcp://RemoteApp@127.0.0.1:10175/user/RemoteMaster");

                ActorRef remoteRouter = getContext().actorOf(
                        Props.create(RemoteActor.class).withRouter(new FromConfig()), "broadcastRouter");

                String msg = "Hello";
                // remoteActor.tell(msg, getSelf());
                remoteRouter.tell(msg, getSelf());
            } else if (message instanceof String) {
                String response = (String) message;
                System.out.println(response);
            }
        }

    }

    public static class RemoteActor extends UntypedActor {
        @Override
        public void onReceive(Object message) throws Exception {
            if (message instanceof String) {
                String msg = (String) message;
                System.out.println(msg);

                String resp = "World";
                getSender().tell(resp, getSelf());

            }
        }
    }
}

В remoteApp.conf порт указан как 10175

RemoteApp.java

public class RemoteApp
{
    public static void main(String[] args)
    {
        RemoteApp app = new RemoteApp();
        app.executeRemote();
    }

    private void executeRemote() {
        ActorSystem system = ActorSystem.create("RemoteApp", ConfigFactory.load("remoteApp"));
        system.actorOf(Props.create(RemoteMaster.class), "RemoteMaster");
    }

    public static class RemoteMaster extends UntypedActor {

        @Override
        public void onReceive(Object message) throws Exception {
            if (message instanceof String) {
                String msg = (String) message;
                System.out.println(msg);
                String response = "World";
                getSender().tell(response, getSelf());
            }
        }
    }

}

Сейчас я не могу понять концепцию удаленной маршрутизации. Развертывает ли он локального субъекта на удаленных машинах и затем отправляет ему сообщения, или подключается к удаленным субъектам на удаленных машинах, а затем отправляет им сообщения?

Используя мой код, я могу отправлять простые сообщения на удаленный компьютер (с использованием выбора акторов), RemoteActor.tell(msg, getSelf()) (закомментированный код) в LocalApp отправляет и получает сообщения и не выдает никаких ошибок.

Но когда я создаю маршрутизатор, используя локальный Actor, я получаю ошибки в виде букв.

[INFO] [02/04/2014 16:34:58.408] [RemoteApp-akka.actor.default-dispatcher-4] [akka://RemoteApp/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FLocalApp%40127.0.0.1%3A10174-0/endpointWriter/endpointReader-akka.tcp%3A%2F%2FLocalApp%40127.0.0.1%3A10174-0] 
Message [akka.remote.transport.AssociationHandle$InboundPayload] from Actor[akka://RemoteApp/deadLetters] to Actor[akka://RemoteApp/system/endpointManager/reliableEndpointWriter-akka.tcp%3A%2F%2FLocalApp%40127.0.0.1%3A10174-0/endpointWriter/endpointReader-akka.tcp%3A%2F%2FLocalApp%40127.0.0.1%3A10174-0#-288427524] was not delivered.
[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'.

Может кто-нибудь сказать мне, что я делаю не так?

---------ОБНОВИТЬ----------

Я выяснил проблему. Удаленные и локальные классы были в разных проектах. Во время базовой связи между локальным и удаленным проектом String был типом передаваемого объекта, поэтому он был успешным. Есть ли способ переноса объектов пользовательских классов между двумя разными проектами? Я попытался реализовать Serializable и добавить его в файл conf, но это не имеет значения

1 ответ

Решение

По умолчанию akka будет использовать сериализацию Java для пользовательских классов сообщений. Если определение класса доступно (т.е. в пути к классам) на обеих сторонах системы (отправляющая и получающая стороны), то вы сможете использовать его для удаленной связи. Мое предложение будет иметь файл JAR, представляющий классы сообщений, которые доступны в пути к классам по обе стороны системы.

Akka также позволит вам использовать разные сериализаторы для разных типов классов сообщений, так что вы не застряли с сериализацией Java, но я советую сначала заставить его работать таким образом, прежде чем экспериментировать с другими сериализаторами, если вы чувствуете такую ​​склонность.

Другие вопросы по тегам