wdrażanie serializacji z Play 2 i zdalnym klastrem Akka

Mam platformę zabaw 2, która jest podłączona do zdalnego systemu klastrów Akka, oba systemy są w Javie. Mam strukturę danych opakowaną w klasę i zaimplementowałem możliwość serializacji w klasie opakowania. Chcę użyć struktury danych do obliczeń zdalnych, ale za każdym razem, gdy próbuję wysłać klasę opakowania do zdalnego systemu Akka, pojawia się błąd.

Poniżej znajdują się fragmenty kodu.

to jest klasa opakowania

package controllers;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Map;

public class Coordinates implements Serializable{


    String className = null;
    Map <String,ArrayList<Object>> jMap = null;
    boolean train = false;

    public Coordinates() { train = true;}

    public Coordinates (String className)
    {   
        this.className = className;     
    }

    public Coordinates (Map <String,ArrayList<Object>> jMap , boolean b)
    {           

        this.jsonMap = jMap;    
        train = b;
             }          
}

jest to klasa aktora, która wysyła obiekt

package controllers;

import akka.actor.ActorRef;
import akka.actor.UntypedActor;

public class LocalActor extends UntypedActor {

     ActorRef masterActor;
    @Override
    public void onReceive(Object arg) throws Exception {
         if(arg instanceof Coordinates)
         {   Coordinates msg = (Coordinates) arg ;
             masterActor.tell(msg , getSelf());
         }      
    }


    public void preStart()
    {
      masterActor = getContext().actorFor("akka://[email protected]:2552/user/masterActor");
    }

}

to jest aktor Akka, który otrzymuje zajęcia

package Rubine_Cluster;

import java.io.Serializable;

import akka.actor.*;


public class MasterActor extends UntypedActor implements Serializable{

    public MasterActor(){System.out.println(" the masteractor has been started ");}

    @Override
    public void onReceive(Object message) throws Exception {
        System.out.print(" this is from before me to you  "+message.toString());

         if(message instanceof Coordinates)
         {   Coordinates msg = (Coordinates) message;

             try { System.out.print(" this is from message  " + msg.jsonMap.toString());
                  getSender().tell( 1234 , getSelf());
                } catch (Exception e) {
                  getSender().tell(new akka.actor.Status.Failure(e), getSelf());
                  throw e;
                }

    }
         else{ unhandled(message);}
  }  
}

to jest komunikat o błędzie z mojego IDE Eclipse

[INFO] [10/02/2012 02:58:35.606] [main] [ActorSystem(MasterNode)] REMOTE: RemoteServerStarted@akka://[email protected]:2552
 Master Node is called 
 the masteractor has been started 
[INFO] [10/02/2012 02:59:28.223] [MasterNode-7] [ActorSystem(MasterNode)] REMOTE: RemoteClientStarted@akka://[email protected]:63305
[ERROR] [10/02/2012 02:59:28.334] [MasterNode-7] [ActorSystem(MasterNode)] REMOTE: RemoteServerError@akka://[email protected]:2552] Error[java.lang.ClassNotFoundException:controllers.Coordinates
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.net.URLClassLoader$1.run(Unknown Source)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
    at java.lang.ClassLoader.loadClass(Unknown Source)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Unknown Source)
    at java.io.ObjectInputStream.resolveClass(Unknown Source)
    at akka.util.ClassLoaderObjectInputStream.resolveClass(ClassLoaderObjectInputStream.scala:12)
    at java.io.ObjectInputStream.readNonProxyDesc(Unknown Source)
    at java.io.ObjectInputStream.readClassDesc(Unknown Source)
    at java.io.ObjectInputStream.readOrdinaryObject(Unknown Source)
    at java.io.ObjectInputStream.readObject0(Unknown Source)
    at java.io.ObjectInputStream.readObject(Unknown Source)
    at akka.serialization.JavaSerializer$$anonfun$1.apply(Serializer.scala:121)
    at scala.util.DynamicVariable.withValue(DynamicVariable.scala:57)
    at akka.serialization.JavaSerializer.fromBinary(Serializer.scala:121)
    at akka.serialization.Serialization.deserialize(Serialization.scala:73)
    at akka.remote.MessageSerializer$.deserialize(MessageSerializer.scala:22)
    at akka.remote.RemoteMessage.payload(RemoteTransport.scala:210)
    at akka.remote.RemoteMarshallingOps$class.receiveMessage(RemoteTransport.scala:276)
    at akka.remote.netty.NettyRemoteTransport.receiveMessage(NettyRemoteSupport.scala:30)
    at akka.remote.netty.RemoteServerHandler.messageReceived(Server.scala:182)
    at org.jboss.netty.channel.SimpleChannelUpstreamHandler.handleUpstream(SimpleChannelUpstreamHandler.java:75)
    at akka.remote.netty.RemoteServerHandler.handleUpstream(Server.scala:154)
    at org.jboss.netty.channel.StaticChannelPipeline.sendUpstream(StaticChannelPipeline.java:366)
    at org.jboss.netty.channel.StaticChannelPipeline$StaticChannelHandlerContext.sendUpstream(StaticChannelPipeline.java:528)
    at org.jboss.netty.handler.execution.ChannelUpstreamEventRunnable.run(ChannelUpstreamEventRunnable.java:44)
    at org.jboss.netty.handler.execution.OrderedMemoryAwareThreadPoolExecutor$ChildExecutor.run(OrderedMemoryAwareThreadPoolExecutor.java:312)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)
]

Zaimplementowałem także klasę Cooperative w systemie Remote Akka. Każda sugestia lub pomoc zostanie doceniona. Dzięki


person faisal abdulai    schedule 02.10.2012    source źródło


Odpowiedzi (2)


Nie musisz dwukrotnie implementować klasy Cooperative. Powinieneś mieć moduł zawierający całą klasę modeli (Koordynator itd.) i uzależnić pozostałe dwa projekty Akka od tego pierwszego.

Powinieneś mieć tego rodzaju zależność projektu/modułu:

module containing Coordinate class (Maven Project)
   |
   ---- Local Actor (Play project)
   |
   ---- Remote Actor (Maven Project)
person ndeverge    schedule 02.10.2012
comment
Czy pierwszy model będzie zawierał klasy abstrakcyjne, które będą implementowane przez oba projekty? Czy możesz mi to bliżej wyjaśnić, jestem trochę nowicjuszem w programowaniu w środowisku Play i akka Java. - person faisal abdulai; 02.10.2012
comment
Nie. Musisz mieć tylko jedną implementację klasy modelu w oddzielnym module lub projekcie, a oba pozostałe projekty muszą zależeć od tego (dostosowując plik Build.scala, playframework.org/documentation/2.0.3/SBTSubProjects) - person ndeverge; 03.10.2012
comment
oznacza to więc, że w środowisku Play muszę dodać zależność do pliku build.scala, a w Akce będę musiał dodać zależność do pliku POM.xml, ponieważ zdalna Akka jest projektem Maven. - person faisal abdulai; 03.10.2012
comment
oznacza to, że musisz utworzyć samodzielny projekt Maven dla swojej klasy modeli, a następnie dodać do niego zależność w projektach Play (Build.scala) i zdalnych projektach Akka (pom.xml) - person ndeverge; 03.10.2012
comment
Jestem tu nowicjuszem. plan jest taki, aby dane z interfejsu gry były podłączone do klasy kontrolera za pomocą Jsona. Zrobiłem tę część. dane są następnie umieszczane w strukturze danych, na przykład Map‹String, Object›. zawiń ten obiekt w klasę i podłącz obiekt klasy do zdalnego systemu Akka, który jest projektem maven. Czy muszę utworzyć plik jar z projektu opakowania. Czy możesz mi pomóc z uproszczonym fragmentem kodu. Błagam Cię. ponieważ projekt jest opóźniony - person faisal abdulai; 03.10.2012

Oczywiście twój główny aktor nie ma kontrolerów. Współrzędne w ścieżce klas. Inna odpowiedź sugerowała możliwość ponownego użycia kodu, ale nie to jest podstawową przyczyną; w niektórych przypadkach nie ma to również sensu (możesz mieć różne operacje na poziomie lokalnym i głównym). Jak zbudowany jest Twój główny aktor? Jak wygląda ścieżka klas? Po prostu dodaj klasę do projektu głównego i wszystko powinno być w porządku.

person Mirko Adari    schedule 10.10.2012